VC环境下三菱PLC与微机的串行通信_第1页
VC环境下三菱PLC与微机的串行通信_第2页
VC环境下三菱PLC与微机的串行通信_第3页
VC环境下三菱PLC与微机的串行通信_第4页
VC环境下三菱PLC与微机的串行通信_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VC环境下三菱PLC与微机的串行通信     摘  要:主要介绍三菱FX系列PLC与上位机之间的通讯协议,并采用CSerial类来实现串行通信,本文给出了程序设计方法和部分源代码。关键字:串行通信  PLC  CSerial0       引言可编程控制器(PLC)是集计算机技术、自动控制技术、通信技术为一体的新型自动控制装置。由于体积小、可靠性高以及组态灵活等优点,PLC在工业控制领域得到了广泛的应用。将PC机与可编程控制器组合起来,充分利用PC机强大的

2、人机接口功能、丰富的应用软件和低廉的价格来共同实现管理、控制一体化成为一个新的发展趋势。本文重点介绍在Windows 2000环境下如何利用VC来实现PC机与三菱PLC之间的串行通讯。1         三菱PLC与计算机之间通信协议FX2系列PLC与计算机之间的通信采用RS-232标准,其传输速率固定为9600bps,奇偶校验位采用偶校验。数据格式如表1所示。数据以帧为单位发送和接收。一个多字符帧由图1所示的五部分组成,其中和校验值是将命令码STXETX之间的字符的ASCII码(十六进制数)相加,取得所得和的最低

3、二位数。STX和ETX分别表示该字符帧的起始标起和结束标志。 图1 数据帧格式                         (1)     起始字元(STX):ASCII码的起始字元STX对应的16进制数位0x02。无论命令信息还是回应信息,它们的起始字元均为STX,接收方以此来判知传输资料的开始。(2)

4、   命令号码:为两位16进制数。所谓命令号码是指上位机要求下位机所执行的动作类别,例如要求读取或写入单点状态、写入或读取暂存器资料、强制设定、运行、停止等。在回应信息中,下位机会将上位机接收到的命令号码原原本本的随同其它信息一同发送给上位机。(3)   元件首地址:对应要操作的元件的相应的地址。如从D123单元中读取数据时,要把它对应的地址:0x10F6发送给PLC。(4)   元件个数:一次读取位元件或字元件的数量。(5)   结束字元(ETX):ASCII码的结束字元ETX对应的16进制数为0x03。无论命令

5、信息还是回应信息,它们的结束字元均为ETX,接收方以此来判知此次通讯已结束。(6)   校验码(Checksum):校验码是将STX-ETX之间的ASCII字元的16进制数值以“LRC(Longitudinal Redundancy Check)”法计算出1个Byte长度(两个16进制数值00-FFH)的校验码。当下位机接收到信息后,用同样的方法计算出接收信息的校验码,如果两个校验码相同,则说明传送正确。FX2系列与计算机之间的通信是以主机发出的初始命令,PLC对其做出响应的方式进行通信的。共有0、1、7、8四种命令,上位机实现对PLC的读写和强行置位。通过ENQ、ACK和

6、NAK,上位机协调与PLC的通信应答。2         编程口操作命令类型 串行通信是计算机与其他机器之间进行通信的一种常用方法,在Windows操作系统中提供了实现各种串行通信的API函数。通过SC-09编程电缆或FX-232-BD通讯模块,可以将PC机和计算机串行通信口RS-232连接起来,可以实现PC机对PLC的RAM区数据进行读、写操作。根据PLC本身所具有的特性,计算机可对PLC进行以下4种类型的操作:(1)   位元件或字元件状态读操作(CMD0);(2)  

7、位元件或字元件状态写操作(CMD1);(3)   位元件强制ON操作(CMD7);(4)   位元件强制OFF操作(CMD8)。3         软件编程(1)   串行通信实现方法       在进行以上四种操作之前要对串行通信口进行必要的初始化。本人采用了一个专门针对串行通信的CSerial类,并在Open函数中进行了进一步的完善。它由MuMega Technologies公司提供的一个Vi

8、sual C+类,我们只要理解CSerial类种的几个成员函数,就能很方便地实现串行通信了。以下是该类定义:class CSerialpublic:       CSerial();       CSerial();       BOOL Open( int nPort , int nBaud,int nParity,int nByteSize,int nStopBits );   &#

9、160;   BOOL Close( void );       int ReadData( void *, int );       int SendData( const char *, int );       int ReadDataWaiting( void );       BOOL IsOpened( void ) retu

10、rn( m_bOpened ); protected:       BOOL WriteCommByte( unsigned char );       HANDLE m_hIDComDev;       OVERLAPPED m_OverlappedRead, m_OverlappedWrite;       BOOL m_bOpened; &#

11、160;   Serial:Open这个成员函数打开通信端口。带五个参数,第一个是串口号,第二个参数是数据传输速率,第三个是数据效验方式,第四个是数据位数,第五个是数据停止位。     Serial:Close函数关闭通信端口。     CSerial:SendData函数把数据从一个缓冲区写到串行端口。第一个参数是缓冲区指针,其中包含要被发送的资料;第二个参数是发送的字节数。     CSerial:ReadData函数从断口接收缓冲区读入数据。第一个参

12、数是缓冲区指针,资料将被放入该缓冲区;第二个参数缓冲区的大小。(2) 位元件或字元件状态读操作操作对象元件:PLC内部的X、Y、M、S、T、C、D元件;命令格式如表1;在发送完上述命令格式代码后,就可以读取PLC响应信息了。响应信息格式如图2; 图2 响应信息格式部分程序代码:BOOL CPlcComDlg:ReadPLC(char *Read, char *address, int bytes)       CSerial Serial;       char read_B

13、UFFER;       if(Serial.Open(m_com, m_Buad, m_Parity, m_Byte, m_StopBites)                     Serial.SendData(&ENQ_request,1);/发送联络讯号      &#

14、160;       Sleep(100);              Serial.ReadData(&read_BUFFER,1);/读取PLC响应讯号              if(read_BUFFER=ACK)    &

15、#160;                              /初始化变量                    

16、; /发送图2命令格式代码ASCII(readdatasum_check,readdata_sum);/将STX-ETX之间的字符相加,转换成ASCII(十六进制),并取和的低二位数。                            if(*readdatasum_CHECK=*readdatasum_check)/和校验

17、                                 /对读出的数据进行处理,转换成整型数                

18、60;                                  for(int j=0;j<bytes/2;j+)            

19、60;                                                  &#

20、160;              for(i=j*2;i<j*2+4;i+)                                 

21、         Readi=(Readi>0x39)?(Readi-0x41+0xA):(Read i-0x30);                                 

22、         Read_valuej=(Read j*4+2<<4)+Read j*4+3)+Read j*4+0)<<4)+Read j*4+1;                            

23、0;                                         return TRUE;        &#

24、160;                                               else   &#

25、160;                               return FALSE;                  

26、;                        /将整数转换成ASCII(十六进制),并取低二位,void CPlcComDlg:ASCII(char *total_databytes, int read_bytes)       unsigned int uTmp;     

27、  uTmp=read_bytes & 0x000f;        total_databytes1=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xA);        uTmp=(read_bytes>>4) & 0x000f;       total_databytes0=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-

28、0xA);       (3) 位元件或字元件状态写操作操作对象元件:PLC内部的X、Y、M、S、T、C、D元件;命令格式如图3所示。图3 位元件或字元件写操作 程序代码(略)。(4) 位元件强制ON操作操作对象元件:PLC内部的X、Y、M、S、T、C元件;命令格式如图4所示。图4 位元件强制ON操作 部分程序代码如下:       void CPlcComDlg:ForceOnOpreation(char *Address)  

29、60;    CSerial Serial;       char read_BUFFER;       CString strtemp;       if(Serial.Open(m_com,9600)                &#

30、160;    Serial.SendData(&ENQ_request,1);              Sleep(100);              Serial.ReadData(&read_BUFFER,1);      

31、        if(read_BUFFER=ACK)                          /初始化变量               &

32、#160;     /发送图4命令格式代码ASCII(Sum_Check,sum); /将STX-ETX之间的字符相加,转换成ASCII(十六进制),并取和的低二位数                     for(i=0;i<2;i+)         

33、0;                  Serial.SendData(&Sum_Checki,1);/和校验                     Sleep(100);          &#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论