上一篇:VC++中使用图形程序设计和动画技术 >>
VC环境下三菱PLC与微机的串行通信
关键字:串行通信 PLC CSerial
引言
可编程控制器(PLC)是集计算机技术、自动控制技术、通信技术为一体的新型自动控制装置。由于体积小、可靠性高以及组态灵活等优点,PLC在工业控制领域得到了广泛的应用。将PC机与可编程控制器组合起来,充分利用PC机强大的人机接口功能、丰富的应用软件和低廉的价格来共同实现管理、控制一体化成为一个新的发展趋势。本文重点介绍在Windows 2000环境下如何利用VC来实现PC机与三菱PLC之间的串行通讯。
三菱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) 位元件或字元件状态读操作
操作对象元件:PLC内部的X、Y、M、S、T、C、D元件;命令格式如表1;在发送完上述命令格式代码后,就可以读取PLC响应信息了。响应信息格式如图2;
部分程序代码:
| BOOL CPlcComDlg::ReadPLC(char *Read, char *address, int bytes) { CSerial Serial; char read_BUFFER; if(Serial.Open(m_com, m_Buad, m_Parity, m_Byte, m_StopBites)) { Serial.SendData(&ENQ_request,1);//发送联络讯号 Sleep(100); Serial.ReadData(&read_BUFFER,1);//读取PLC响应讯号 if(read_BUFFER==ACK) { //初始化变量 //发送图2命令格式代码 ASCII(readdatasum_check,readdata_sum); //将STX-ETX之间的字符相加,转换成ASCII(十六进制),并取和的低二位数。 if(*readdatasum_CHECK==*readdatasum_check)//和校验 { //对读出的数据进行处理,转换成整型数 for(int j=0;j<bytes/2;j++) { for(i=j*2;i<j*2+4;i++) Read[i]=(Read[i]>0x39)?(Read[i]-0x41+0xA):(Read [i]-0x30); Read_value[j]=(((((Read [j*4+2]<<4)+Read [j*4+3]))+Read [j*4+0])<<4)+Read [j*4+1]; } return TRUE; } else return FALSE; } } } } //将整数转换成ASCII(十六进制),并取低二位, void CPlcComDlg::ASCII(char *total_databytes, int read_bytes) { unsigned int uTmp; uTmp=read_bytes & 0x000f; total_databytes[1]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xA); uTmp=(read_bytes>>4) & 0x000f; total_databytes[0]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xA); } |
(3) 位元件或字元件状态写操作
操作对象元件:PLC内部的X、Y、M、S、T、C、D元件;命令格式如图3所示。
程序代码(略)。
(4) 位元件强制ON操作
操作对象元件:PLC内部的X、Y、M、S、T、C元件;命令格式如图4所示。
部分程序代码如下:
| void CPlcComDlg::ForceOnOpreation(char *Address) { CSerial Serial; char read_BUFFER; CString strtemp; if(Serial.Open(m_com,9600)) { Serial.SendData(&ENQ_request,1); Sleep(100); Serial.ReadData(&read_BUFFER,1); if(read_BUFFER==ACK) { //初始化变量 //发送图4命令格式代码 ASCII(Sum_Check,sum); //将STX-ETX之间的字符相加,转换成ASCII(十六进制),并取和的低二位数 for(i=0;i<2;i++) Serial.SendData(&Sum_Check[i],1);//和校验 Sleep(100); Serial.ReadData(&read_buffer,1); if(read_buffer==ACK) return TRUE; else return FALSE; } } } |
(5) 位元件强制OFF操作
操作对象元件:PLC内部的X、Y、M、S、T、C元件;命令格式如图5所示。
程序代码(略)。
实时通讯控制界面
本程序能够实现远程控制FX系列PLC的运行。能读取位元件的当前状态,以及对它们置位和复位。能够读取字元件的值和往字元件写值。并能自动连续读取单个字元件的值。
结论
本程序实现了上位机对三菱PLC的实时监控,传送数据准确,这种通信方法不仅成本低,而且简单、稳定、实用性强。
下一篇:在MFC下如何定义全局变量和全局函数 >>
相关文章:
- · COM接口在不同线程中的传递技巧两则
- · JFC/Swing活学活用之创建自定义图像组件
- · 专家称Java在WEB开发领域处境危险
- · 微软称浏览器每年都升级 IE8将在08年上市
- · 微软迎来迟到幸福 10天进账额相当于5年总和
- · IE7上市临近 微软Google口水战不断升级
- · 欧盟拟对微软展开第二轮反垄断调查
- · 微软透露新测试版本Word将支持博客功能
- · 数据挖掘开山鼻祖阿格拉瓦加盟微软
- · 微软抛上亿美元订单 软件测试人才成香饽饽
- · 微软瞄准消费安全软件市场 将冲击现有格局
- · 微软酝酿新搜索软件抗Google 夏天推测试版
- · 微软英特尔认为个人电脑时代没有结束
- · 发改委与微软签署软件产业合作谅解备忘录
- · 微软与信产部签协议 2.5亿投资农村信息化
- · Sun发布Beta 2测试版Java SE 6
- · .NET2.0中一种简单的窗口控件状态控制法
- · ASP.NET开发购物推车之购物车类
- · ASP.NET中的三种表格化数据方法
- · ASP.NET入门随想之多态、接口与委托
- · ASP.NET入门随想之明明白白我的心
- · COM组件设计与应用之编译、注册、调用
- · COM 组件设计与应用之数据类型
- · COM组件设计与应用之.NET中用ATL写组件
- · MATCOM在VC++与MATLAB混合编程中的应用
- · COM组件设计与应用之实现多接口
- · 美军为防黑客入侵禁用商业电子邮箱
- · Oracle中使用PL/SQL操作COM对象
- · 驯服Tiger之访问环境变量和调用子进程
- · VC++初学者经典错误LNK2001详解
- · ODBC中的FX/Bulk RFX数据交换机制分析
- · Visual C++中DDB与DIB位图编程全攻略
- · 泛型与模板的有机结合 STL.NET简介
- · 用VC实现特定编辑框上对回车键响应
- · 用Visual C# 实现四则混合运算
- · C#中利用mediaplayer打造mp3播放器
- · C#开发的两个原则的深入讨论
- · Visual C#构建网络计算机树形图
