با سلام مجدد به همه ، من میخوام برای plc دلتا بوسیله vb.net برنامه بنویسم . اول میخواستم بدونم از کجا باید شروع کنم یعنی الان پروتکل rs232 رو میدونم تو دلتا اما نمیدونم پی ال سی دیتا رو چه موقع میفرسته و چه موقع میگیره ، سوال بعد هم اینه که چطور با rs485 ارتباط برقرار کنم ؟ با تشکر از همه
اطلاعیه
Collapse
No announcement yet.
plc و vb.net
Collapse
X
-
پاسخ : plc و vb.net
ایول
این از اون تیپ کاراست که من دوست دارم.
من با avr این کار رو کردم و یه چیز تو مایه های HMI ساختم.
باید پروتکل Modbus رو بدونی که البته خود delta یه pdf داره براش. برنامه و pdf رو برات گزاشتم ببین چی کار میکنی.
مهمترین قسمت کار دونستن memory mapping مدل plc شماست که نگفتی. مثلا پورت های X و Y تو هر سری یه آدرس دارن و تایمرها و ... هم همینطور.
http://s2.picofile.com/file/7230500000/DVP_PLC.rar.html
یه توضیح کوچیک بدم برات :
باید بدونی که پی ال سی ها دو جور میشه با پورت سریالشون کار کرد. حالت اول اینه که بیای و تو PLC برنامه بنویسی که یه چیزایی رو رو پورت سریالش بفرسته که راحته ولی زیاد به نظر من اصولی نیست.
حالت دوم اینه که مثل یه HMI به PLC وصل بشی. یه این صورت که خود PLC ها اکثرا از پروتکل Modbus یا Hostlink و ... استفاده میکنن که این پروتکل ها بسته بندی خاصی از اطلاعات هستن. یه این صورت که شما هیچ برنامه ای لازم نیست سمت PLC بابت سریال پورت بنویسی و خود این پروتکل که به صورت پیش فرض PLC ازش پشتیبانی میکنه تمام نیاز تو رو برآورده میکنه. تو این پروتکل ها میتونی مقدار هر تایمر و ورودی خروجی و رجیستر و ... رو بخونی و یا تغییر بدی.
پروتکل modbus به این صورته که میای و یه فیلد میفرستی که با : شروع میشه و با enter تموم میشه و PLC به همین شکل به تو جواب میده. حالا اینکه محتوای این فیلد چیه باید بگم یه سری عدد در مبنای HEx هست که به صورت کاراکترهای اسکی ارسال میشه یعنی میتونی اول تو Hyper terminal تست کنی.
این مثال تو همون pdf که گزاشتم هست
PC→PLC “:01 01 06 14 00 25 BF CR LF”
PLC→PC “:01 01 05 CD 6B B2 0E 1B D6 CR LF”
که منظور از CR و LF کاراکتر های a هگز و c هگز هستن یا همون Enter خودمون
اینم کدی که من برای پروژم نوشتم.
کد:#ifndef _HOST_LINK_ #define _HOST_LINK_ /*******************************************/ #include <avr\io.h> #include <stdlib.h> #include "uart.h" /*******************************************/ int read_PLC_TimerPV(int timer); int read_PLC_register(int timer_addr); char read_single_coil(int addr); void write_PLC_register(int addr,int value); void write_single_coil(int addr,char value); /*******************************************/ // RS485 direction pin is PC4 #define RS485_RX() cbi(PORTD,2);sbi(DDRD,2);UART_RX_ENABLE() #define RS485_TX() sbi(PORTD,2);sbi(DDRD,2);UART_RX_DISABLE() /*******************************************/ char msg[ 128 ]; volatile char modbus_rx_buf[128]; #define MBRX_WAIT_START 0 // wait to @ #define MBRX_WAIT_END 1 // wait to * #define MBRX_END 2 // finished volatile char modbus_rx_state = MBRX_WAIT_START; volatile char modbus_error = 0; /*******************************************/ ISR( USART_RXC_vect ) { static unsigned char index = 0; unsigned char t; t = UDR; if( modbus_rx_state == MBRX_WAIT_START ) { if( t == ':' ) { modbus_rx_state = MBRX_WAIT_END; index = 1; modbus_rx_buf[0] = ':'; // clear buffer for( t = 1; t < 128; t++ ) modbus_rx_buf[t] = 0; } } else if( modbus_rx_state == MBRX_WAIT_END ) { modbus_rx_buf[ index ] = t; index++; if( t == '\n' ) modbus_rx_state = MBRX_END; } } /*******************************************/ void init_modbus() { uart_init(UART_115200);//9600 UART_RXINT_ON(); } /*******************************************/ char modbus_get_lcr(char *str) { unsigned char i , lcr = 0 , t; //caclulate LCR for(i = 0; str[i]; i++) { if( str[i] >= '0' && str[i] <= '9' ) t = str[i] - '0'; else t = (str[i]-'A')+10; t = t << 4; i++; if( str[i] >= '0' && str[i] <= '9' ) t += str[i] - '0'; else t += (str[i]-'A')+10; lcr += t; } lcr = 0x100 - lcr; return lcr; } /*******************************************/ void modbus_sendCommand(char *str) { unsigned char lcr = 0; lcr = modbus_get_lcr(str); // add fcs and * to header RS485_TX(); _delay_ms(2); sprintf_P( str , PSTR("%s%02X\r\n") , str , lcr ); uart_put(':'); uart_str( str ); while(UART_TX_COMPLETE()==0); while(UART_TR_READY()==0); uart_Flush(); _delay_us(150); RS485_RX(); }// error 4506 /*******************************************/ // send a string to plc and wait 1 sec to answer char modbus_sendRequest_P(char* request) { unsigned char i; sprintf_P( msg , request ); modbus_rx_state = MBRX_WAIT_START; modbus_sendCommand( msg ); for( i = 0; modbus_rx_state != MBRX_END ; i++) { if( i == 100 ) return 1; _delay_ms(10); } return 0; } /*******************************************/ // send global string msg to plc and wait 1 sec to answer char modbus_sendRequest() { unsigned char i; modbus_rx_state = MBRX_WAIT_START; modbus_sendCommand( msg ); for( i = 0; modbus_rx_state != MBRX_END ; i++) { if( i == 100 ) return 1; _delay_ms(10); } return 0; } /*******************************************/ // checks recived frame // returns 0 if ok char modbus_check_frame(char* str) { unsigned char i , frame_lcr; for( i = 1; (str[i]!=0) && (str[i]!='\r') ; i++ ); // str[i] = 0; frame_lcr = (int)strtol(str-2+i, (char **)NULL, 16); str[i-2] = 0; return modbus_get_lcr( str+1 ) != frame_lcr; } /*******************************************/ unsigned int rplc_pv; int read_PLC_TimerPV(int timer) { unsigned char t = 0 , lcr , trys; for( trys = 0; trys < 3 ; trys++ ) { modbus_error = 0; timer += 0x600; // timer pv base address sprintf_P( msg , PSTR("0103%04X0001") , timer ); if( modbus_sendRequest() != 0 ) { // comminication timeouted modbus_error = 1; } else { if( modbus_check_frame((char*)modbus_rx_buf) ) { modbus_error = 1; return 0; } t = sscanf_P( (char*)(modbus_rx_buf+1) , PSTR("010302%4X%2X") , &rplc_pv,&lcr ); } // if no error ocurse break for(;;) loop if( modbus_error == 0 ); break; _delay_ms(30); } if( modbus_error == 0 ) return rplc_pv; return rplc_pv; } /*******************************************/ unsigned int rplc_sv; int read_PLC_register(int timer_addr) { unsigned char t = 0 , lcr , trys; //timer += 0x1000+408; // timer sv located from D408 for( trys = 0; trys < 3 ; trys++ ) { modbus_error = 0; sprintf_P( msg , PSTR("0103%04X0001") , timer_addr ); if( modbus_sendRequest() != 0 ) { // comminication timeouted modbus_error = 1; } else { if( modbus_check_frame((char*)modbus_rx_buf) ) modbus_error = 1; t = sscanf_P( (char*)(modbus_rx_buf+1) , PSTR("010302%4X%2X") , &rplc_sv , &lcr ); } // if no error ocurse break for(;;) loop if( modbus_error == 0 ); break; _delay_ms(30); } if( modbus_error == 0 ) return rplc_sv; return 0; } /*******************************************/ unsigned int rplc_coil; char read_single_coil(int addr) { // use command 01 unsigned char t = 0 , lcr , trys; for( trys = 0; trys < 3 ; trys++ ) { modbus_error = 0; sprintf_P( msg , PSTR("0102%04X0001") , addr ); if( modbus_sendRequest() != 0 ) { // comminication timeouted modbus_error = 1; } else { if( modbus_check_frame((char*)modbus_rx_buf) ) { modbus_error = 1; return 0; } t = sscanf_P( (char*)(modbus_rx_buf+1) , PSTR("010201%2X%2X") , &rplc_coil,&lcr ); } if( modbus_error == 0 ) break; _delay_ms(30); } if( modbus_error == 0 ) return rplc_coil&0x01; return 0; } /**************************************************************************************/ /*********************************** Write functions **********************************/ void write_PLC_register(int addr,int value) { sprintf_P( msg , PSTR("0106%04X%04X") , addr , value ); if( modbus_sendRequest() != 0 ) { // comminication timeouted modbus_error = 1; } } /*******************************************/ void write_single_coil(int addr,char value) { // use command 05:Force single coil if( value ) sprintf_P( msg , PSTR("0105%04XFF00") , addr , value ); else sprintf_P( msg , PSTR("0105%04X0000") , addr , value ); if( modbus_sendRequest() != 0 ) { // comminication timeouted modbus_error = 1; } } /*******************************************/ #endif
بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست
-
پاسخ : پاسخ : plc و vb.net
نوشته اصلی توسط taninpersianدوست گلم به قول خودمون دمت گرم ، سوال زیاد دارم اگه حال و حوصله داشتی و دلت خواست کمکم کن تا بتونیم یه کاری کنیم که خودمون همه کار کنیم اولش اینه که تو این پاکت دیتا که داریم میفرستیم بین کاراکتر ها باید فاصله باشه یا نباشه (space)
نوشته اصلی توسط taninpersianیک سوال دیگه هم اینه که وقتی تو حالت دوم که مثال هم داره وقتی من پاکت دیتا رو فرستادم باید منتظر جواب باشم ؟ و هر وقت که ":" برام رسید بقیشو بخونم؟
باید منتظر : باشی و وقتی رسید تا رسیدن CR و LF همشو بریزی تو آرایه تا بعد آنالیزشون کنیبت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست
دیدگاه
-
پاسخ : plc و vb.net
نوشته اصلی توسط taninpersianممنون دوست عزیز ، بازم سوال ، با rs485 چطور میتونم این کارو کنم ؟ و همون یک ثانیه برای انتظار جواب کافیه ؟ اگه یک ثانیه تموم شد باید مجدد درخواست بدم ؟
آره 1 ثانیه بسشه. ولی یه نکته ای هست که من هیچ وقت خودمم سر در نیاوردم.
برای همین بهت میگم اولش از طریق همون پورتی که پروگرام میکنی PLC رو با RS232 به کامپیوتر وصلش کن بعد یه نکاتی تو RS485 بهت میگم که خودمم دلیلشون رو نمیدونم ولی تجربی فهمیدم.
بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست
دیدگاه
-
پاسخ : plc و vb.net
اما دوست گلم یه سوال خیلی مهم <<<<< من اگه بخوام rpm یه موتورو بخونم اونوقت اگه برای هر ارسال و دریافت حداقل یک ثانیه هم وقت تلف کنم تو خروجی مونیتورم هیچ وقت سرعت لحظه ای نمیتونم داشته باشم >>>>> اینو چیکار میشه کرد؟؟؟؟؟؟؟؟؟ :surprised:M.R.R
دیدگاه
-
پاسخ : plc و vb.net
نوشته اصلی توسط taninpersianاما دوست گلم یه سوال خیلی مهم <<<<< من اگه بخوام rpm یه موتورو بخونم اونوقت اگه برای هر ارسال و دریافت حداقل یک ثانیه هم وقت تلف کنم تو خروجی مونیتورم هیچ وقت سرعت لحظه ای نمیتونم داشته باشم >>>>> اینو چیکار میشه کرد؟؟؟؟؟؟؟؟؟ :surprised:
شما اصلا نمیتونید اینکار رو با سریال پوت انجام بدید. باید خود PLC مقدارش رو محاسبه و تو یه رجیستر تو PLC بریزه مثلا D300 و PC بیاد اون رجیستر رو بخونه و نمایش بده.
1 ثانیه هم زمان timeout هستش من که تجربه کردم سری ES2 تو کمتر از 50 میلی ثانیه جواب رو برمیگردوند.
بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست
دیدگاه
-
پاسخ : plc و vb.net
با تشکر از اقای گیلانی ، دوست عزیز این فایل رو من قبلا مطالعه کردم و تقریبا میدونم که مدباس به چه صورت عمل میکنه اما چون میخوام فردا اولین تستمو با پی ال سی انجام بدم میخوام تمام پیش زمینه هارو داشته باشم و مشکلاتی که ممکنه پیش بیاد رو بدونم و اگه برنامه تستی هم باشه که مطالعه کنم بهتره مساله بعدی هم اینه که سرعت پاسخگویی میخوام بسیار بالا باشه که به صورت لحظه ای بتونم مانیتورینگ داشته باشم
M.R.R
دیدگاه
-
پاسخ : پاسخ : plc و vb.net
نوشته اصلی توسط taninpersianبا تشکر از اقای گیلانی ، دوست عزیز این فایل رو من قبلا مطالعه کردم و تقریبا میدونم که مدباس به چه صورت عمل میکنه اما چون میخوام فردا اولین تستمو با پی ال سی انجام بدم میخوام تمام پیش زمینه هارو داشته باشم و مشکلاتی که ممکنه پیش بیاد رو بدونم و اگه برنامه تستی هم باشه که مطالعه کنم بهتره مساله بعدی هم اینه که سرعت پاسخگویی میخوام بسیار بالا باشه که به صورت لحظه ای بتونم مانیتورینگ داشته باشمبت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست
دیدگاه
دیدگاه