Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16498742
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:00:39

下载本文示例代码
  三菱PLC与计算机之间通信协议  FX2系列PLC与计算机之间的通信采用RS-232标准,其传输速率固定为9600bps,奇偶校验位采用偶校验。数据格式如表1所示。数据以帧为单位发送和接收。一个多字符帧由图1所示的五部分组成,其中和校验值是将命令码STX--ETX之间的字符的ASCII码(十六进制数)相加,取得所得和的最低二位数。STX和ETX分别表示该字符帧的起始标起和结束标志。 图1 数据帧格式  (1) 起始字元(STX):ASCII码的起始字元STX对应的16进制数位0x02。无论命令信息还是回应信息,它们的起始字元均为STX,接收方以此来判知传输资料的开始。  (2) 命令号码:为两位16进制数。所谓命令号码是指上位机要求下位机所执行的动作类别,例如要求读取或写入单点状态、写入或读取暂存器资料、强制设定、运行、停止等。在回应信息中,下位机会将上位机接收到的命令号码原原本本的随同其它信息一同发送给上位机。  (3) 元件首地址:对应要操作的元件的相应的地址。如从D123单元中读取数据时,要把它对应的地址:0x10F6发送给PLC。  (4) 元件个数:一次读取位元件或字元件的数量。  (5) 结束字元(ETX):ASCII码的结束字元ETX对应的16进制数为0x03。无论命令信息还是回应信息,它们的结束字元均为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和NAK,上位机协调与PLC的通信应答。  编程口操作命令类型   串行通信是计算机与其他机器之间进行通信的一种常用方法,在Windows操作系统中提供了实现各种串行通信的API函数。通过SC-09编程电缆或FX-232-BD通讯模块,可以将PC机和计算机串行通信口RS-232连接起来,可以实现PC机对PLC的RAM区数据进行读、写操作。根据PLC本身所具有的特性,计算机可对PLC进行以下4种类型的操作:  (1) 位元件或字元件状态读操作(CMD0);  (2) 位元件或字元件状态写操作(CMD1);  (3) 位元件强制ON操作(CMD7);  (4) 位元件强制OFF操作(CMD8)。  软件编程  (1) 串行通信实现方法  在进行以上四种操作之前要对串行通信口进行必要的初始化。本人采用了一个专门针对串行通信的CSerial类,并在Open函数中进行了进一步的完善。它由MuMega Technologies公司提供的一个Visual C 类,我们只要理解CSerial类种的几个成员函数,就能很方便地实现串行通信了。以下是该类定义: class CSerial{ public:  CSerial();  ~CSerial();  BOOL Open( int nPort , int nBaud,int nParity,int nByteSize,int nStopBits );  BOOL Close( void );  int ReadData( void *, int );  int SendData( const char *, int );  int ReadDataWaiting( void );  BOOL IsOpened( void ){ return( m_bOpened ); } protected:  BOOL WriteCommByte( unsigned char );  HANDLE m_hIDComDev;  OVERLAPPED m_OverlappedRead, m_OverlappedWrite;  BOOL m_bOpened;};  ① Serial::Open这个成员函数打开通信端口。带五个参数,第一个是串口号,第二个参数是数据传输速率,第三个是数据效验方式,第四个是数据位数,第五个是数据停止位。  ② Serial::Close函数关闭通信端口。  ③ CSerial::SendData函数把数据从一个缓冲区写到串行端口。第一个参数是缓冲区指针,其中包含要被发送的资料;第二个参数是发送的字节数。  ④ CSerial::ReadData函数从断口接收缓冲区读入数据。第一个参数是缓冲区指针,资料将被放入该缓冲区;第二个参数缓冲区的大小。共2页。 1 2 :   三菱PLC与计算机之间通信协议  FX2系列PLC与计算机之间的通信采用RS-232标准,其传输速率固定为9600bps,奇偶校验位采用偶校验。数据格式如表1所示。数据以帧为单位发送和接收。一个多字符帧由图1所示的五部分组成,其中和校验值是将命令码STX--ETX之间的字符的ASCII码(十六进制数)相加,取得所得和的最低二位数。STX和ETX分别表示该字符帧的起始标起和结束标志。 图1 数据帧格式  (1) 起始字元(STX):ASCII码的起始字元STX对应的16进制数位0x02。无论命令信息还是回应信息,它们的起始字元均为STX,接收方以此来判知传输资料的开始。  (2) 命令号码:为两位16进制数。所谓命令号码是指上位机要求下位机所执行的动作类别,例如要求读取或写入单点状态、写入或读取暂存器资料、强制设定、运行、停止等。在回应信息中,下位机会将上位机接收到的命令号码原原本本的随同其它信息一同发送给上位机。  (3) 元件首地址:对应要操作的元件的相应的地址。如从D123单元中读取数据时,要把它对应的地址:0x10F6发送给PLC。  (4) 元件个数:一次读取位元件或字元件的数量。  (5) 结束字元(ETX):ASCII码的结束字元ETX对应的16进制数为0x03。无论命令信息还是回应信息,它们的结束字元均为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和NAK,上位机协调与PLC的通信应答。  编程口操作命令类型   串行通信是计算机与其他机器之间进行通信的一种常用方法,在Windows操作系统中提供了实现各种串行通信的API函数。通过SC-09编程电缆或FX-232-BD通讯模块,可以将PC机和计算机串行通信口RS-232连接起来,可以实现PC机对PLC的RAM区数据进行读、写操作。根据PLC本身所具有的特性,计算机可对PLC进行以下4种类型的操作:  (1) 位元件或字元件状态读操作(CMD0);  (2) 位元件或字元件状态写操作(CMD1);  (3) 位元件强制ON操作(CMD7);  (4) 位元件强制OFF操作(CMD8)。  软件编程  (1) 串行通信实现方法  在进行以上四种操作之前要对串行通信口进行必要的初始化。本人采用了一个专门针对串行通信的CSerial类,并在Open函数中进行了进一步的完善。它由MuMega Technologies公司提供的一个Visual C 类,我们只要理解CSerial类种的几个成员函数,就能很方便地实现串行通信了。以下是该类定义: class CSerial{ public:  CSerial();  ~CSerial();  BOOL Open( int nPort , int nBaud,int nParity,int nByteSize,int nStopBits );  BOOL Close( void );  int ReadData( void *, int );  int SendData( const char *, int );  int ReadDataWaiting( void );  BOOL IsOpened( void ){ return( m_bOpened ); } protected:  BOOL WriteCommByte( unsigned char );  HANDLE m_hIDComDev;  OVERLAPPED m_OverlappedRead, m_OverlappedWrite;  BOOL m_bOpened;};  ① Serial::Open这个成员函数打开通信端口。带五个参数,第一个是串口号,第二个参数是数据传输速率,第三个是数据效验方式,第四个是数据位数,第五个是数据停止位。  ② Serial::Close函数关闭通信端口。  ③ CSerial::SendData函数把数据从一个缓冲区写到串行端口。第一个参数是缓冲区指针,其中包含要被发送的资料;第二个参数是发送的字节数。  ④ CSerial::ReadData函数从断口接收缓冲区读入数据。第一个参数是缓冲区指针,资料将被放入该缓冲区;第二个参数缓冲区的大小。共2页。 1 2 : 下载本文示例代码


VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信VC环境下三菱PLC与微机的串行通信
阅读(137) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~