اطلاعیه

Collapse
No announcement yet.

plc و vb.net

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    plc و vb.net

    با سلام مجدد به همه ، من میخوام برای plc دلتا بوسیله vb.net برنامه بنویسم . اول میخواستم بدونم از کجا باید شروع کنم یعنی الان پروتکل rs232 رو میدونم تو دلتا اما نمیدونم پی ال سی دیتا رو چه موقع میفرسته و چه موقع میگیره ، سوال بعد هم اینه که چطور با rs485 ارتباط برقرار کنم ؟ با تشکر از همه
    M.R.R

    #2
    پاسخ : 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
    بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
    اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

    دیدگاه


      #3
      پاسخ : plc و vb.net

      دوست گلم به قول خودمون دمت گرم ، سوال زیاد دارم اگه حال و حوصله داشتی و دلت خواست کمکم کن تا بتونیم یه کاری کنیم که خودمون همه کار کنیم اولش اینه که تو این پاکت دیتا که داریم میفرستیم بین کاراکتر ها باید فاصله باشه یا نباشه (space)
      M.R.R

      دیدگاه


        #4
        پاسخ : plc و vb.net

        یک سوال دیگه هم اینه که وقتی تو حالت دوم که مثال هم داره وقتی من پاکت دیتا رو فرستادم باید منتظر جواب باشم ؟ و هر وقت که ":" برام رسید بقیشو بخونم؟
        M.R.R

        دیدگاه


          #5
          پاسخ : پاسخ : plc و vb.net

          نوشته اصلی توسط taninpersian
          دوست گلم به قول خودمون دمت گرم ، سوال زیاد دارم اگه حال و حوصله داشتی و دلت خواست کمکم کن تا بتونیم یه کاری کنیم که خودمون همه کار کنیم اولش اینه که تو این پاکت دیتا که داریم میفرستیم بین کاراکتر ها باید فاصله باشه یا نباشه (space)
          نه space نباید باشه

          نوشته اصلی توسط taninpersian
          یک سوال دیگه هم اینه که وقتی تو حالت دوم که مثال هم داره وقتی من پاکت دیتا رو فرستادم باید منتظر جواب باشم ؟ و هر وقت که ":" برام رسید بقیشو بخونم؟
          بله
          باید منتظر : باشی و وقتی رسید تا رسیدن CR و LF همشو بریزی تو آرایه تا بعد آنالیزشون کنی
          بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
          اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

          دیدگاه


            #6
            پاسخ : plc و vb.net

            ممنون دوست عزیز ، بازم سوال ، با rs485 چطور میتونم این کارو کنم ؟ و همون یک ثانیه برای انتظار جواب کافیه ؟ اگه یک ثانیه تموم شد باید مجدد درخواست بدم ؟
            M.R.R

            دیدگاه


              #7
              پاسخ : plc و vb.net

              نوشته اصلی توسط taninpersian
              ممنون دوست عزیز ، بازم سوال ، با rs485 چطور میتونم این کارو کنم ؟ و همون یک ثانیه برای انتظار جواب کافیه ؟ اگه یک ثانیه تموم شد باید مجدد درخواست بدم ؟
              yes sir
              آره 1 ثانیه بسشه. ولی یه نکته ای هست که من هیچ وقت خودمم سر در نیاوردم.
              برای همین بهت میگم اولش از طریق همون پورتی که پروگرام میکنی PLC رو با RS232 به کامپیوتر وصلش کن بعد یه نکاتی تو RS485 بهت میگم که خودمم دلیلشون رو نمیدونم ولی تجربی فهمیدم.
              بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
              اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

              دیدگاه


                #8
                پاسخ : plc و vb.net

                یک بار دیگه ممنون :wow:اگه همه ما ایرانیا تو همه زمینه ها با هم همینطور همکاری داشته باشیم خیلی وضعمون بهتر میشه :cry2:
                M.R.R

                دیدگاه


                  #9
                  پاسخ : plc و vb.net

                  اما دوست گلم یه سوال خیلی مهم <<<<< من اگه بخوام rpm یه موتورو بخونم اونوقت اگه برای هر ارسال و دریافت حداقل یک ثانیه هم وقت تلف کنم تو خروجی مونیتورم هیچ وقت سرعت لحظه ای نمیتونم داشته باشم >>>>> اینو چیکار میشه کرد؟؟؟؟؟؟؟؟؟ :surprised:
                  M.R.R

                  دیدگاه


                    #10
                    پاسخ : plc و vb.net

                    نوشته اصلی توسط taninpersian
                    اما دوست گلم یه سوال خیلی مهم <<<<< من اگه بخوام rpm یه موتورو بخونم اونوقت اگه برای هر ارسال و دریافت حداقل یک ثانیه هم وقت تلف کنم تو خروجی مونیتورم هیچ وقت سرعت لحظه ای نمیتونم داشته باشم >>>>> اینو چیکار میشه کرد؟؟؟؟؟؟؟؟؟ :surprised:
                    هاهاها
                    شما اصلا نمیتونید اینکار رو با سریال پوت انجام بدید. باید خود PLC مقدارش رو محاسبه و تو یه رجیستر تو PLC بریزه مثلا D300 و PC بیاد اون رجیستر رو بخونه و نمایش بده.
                    1 ثانیه هم زمان timeout هستش من که تجربه کردم سری ES2 تو کمتر از 50 میلی ثانیه جواب رو برمیگردوند.
                    بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
                    اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

                    دیدگاه


                      #11
                      پاسخ : plc و vb.net

                      اینو که میدونم ، منظورم این بود که بخوام هر یک ثانیه بخونم تاخیر میفته و من میخوام مثلا هر 1 میلی ثانیه کل رجیستر ها و ورودی ها و خروجی هارو چک کنم و رو مانیتور نشون بدم
                      M.R.R

                      دیدگاه


                        #12
                        پاسخ : plc و vb.net

                        سلام دوست عزیز
                        با اجازه از حضور آقا مصطفی
                        البته من از پروتکل و دیتای PLC دلتا اطلاعی ندارم ولی در کل پیاده کردن پروتکل ModBus خیلی ساده است از لینک زیر استفاده کنید.
                        موفق باشید.
                        http://www.modbus.org/docs/Modbus_over_serial_line_V1_02.pdf

                        دیدگاه


                          #13
                          پاسخ : plc و vb.net

                          با تشکر از اقای گیلانی ، دوست عزیز این فایل رو من قبلا مطالعه کردم و تقریبا میدونم که مدباس به چه صورت عمل میکنه اما چون میخوام فردا اولین تستمو با پی ال سی انجام بدم میخوام تمام پیش زمینه هارو داشته باشم و مشکلاتی که ممکنه پیش بیاد رو بدونم و اگه برنامه تستی هم باشه که مطالعه کنم بهتره مساله بعدی هم اینه که سرعت پاسخگویی میخوام بسیار بالا باشه که به صورت لحظه ای بتونم مانیتورینگ داشته باشم
                          M.R.R

                          دیدگاه


                            #14
                            پاسخ : پاسخ : plc و vb.net

                            نوشته اصلی توسط taninpersian
                            با تشکر از اقای گیلانی ، دوست عزیز این فایل رو من قبلا مطالعه کردم و تقریبا میدونم که مدباس به چه صورت عمل میکنه اما چون میخوام فردا اولین تستمو با پی ال سی انجام بدم میخوام تمام پیش زمینه هارو داشته باشم و مشکلاتی که ممکنه پیش بیاد رو بدونم و اگه برنامه تستی هم باشه که مطالعه کنم بهتره مساله بعدی هم اینه که سرعت پاسخگویی میخوام بسیار بالا باشه که به صورت لحظه ای بتونم مانیتورینگ داشته باشم
                            اخوی اسمش روشه : مانیتورینگ یعنی نمایش دادن. در هیچ پروتکلی برای مانیتورینگ زمان مهم نیست چون مخاطب سیستم مانیتورینگ آدمیزاده که تا دوزاریش بیافته 10 ثانیه طول میکشه پس هیچ وقت پروتکل ها رو اونقدر سریع طراحی نمیکنن. حتی اگه خود شما فریم ها رو بفرستید تظمینی نیست که اینقدر سریع برسه. من اصلا صلاح نمیدونم شما سیستمتون رو برپایه سرعت بالای این ارتباط طراحی کنید. بهتره فقط اطلاعات جهت نمایش و انجام تنظیمات بین PLC و PC رد و بدل بشه.
                            بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
                            اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

                            دیدگاه


                              #15
                              پاسخ : plc و vb.net

                              :cry: بازم سلام ، آقا ما که هر کاری میکنیم از plc چیزی به com نمیفرسته :cry2: لطفا کمممممممممممممممممممممممممممک
                              M.R.R

                              دیدگاه

                              لطفا صبر کنید...
                              X