通信与信息处理
Communication and Information Processing
《自动化技术与应用>> 2020年第39卷第12朋
基于C++的欧姆龙PLC 以太网通讯实现*
*基金项目:安徽省重点研究和开发计划对外科技合作项目《制冷(热 泵)机组用节能型全工况測试评价系统的研发》(编号201904bll020019) 收稿日期:2019-08-09
陈熙,张成,黄维东,李晨安,王晓光
(合肥通用机械研究院有限公司,安徽 合肥230031)
摘要:本文介绍了一种采用FINS 信息服务的欧姆龙PLC 与上位机的通讯程序开发过程。首先介绍了 FINS 协议指令的数据帧结
构,然后阐述了PLC 的通讯设置与FINS 指令发送和响应。最后,以欧姆龙CP1H 型PLC 为例,在C++ Builder 环境下利用
Socket 实现的PLC 控制网络通讯代码实例。结果表明,本程序通过以太网可以迅速完成上位机与PLC 的读写操作。
关键词:C++,欧姆龙PLC ;以太网通讯s FINS
中图分类号:TP312 文献标识码:A 文章编号:1003-7241(2020)012-0066-04
Implementation of OMRON PLC Ethernet
Communication Based on C++
CHEN Xi, ZHANG Cheng, HUANG Wei-dong, LI Chen-an, WANG Xiao-guang
(Hefei General Machinery Research Institute Co., Ltd., Hefei 230031 China )
Abstract: This paper introduces a communication program between OMRON PLC and PC using FINS information service. Firstly,
the data frame structure of FINS protocol instructions is introduced, then the communication settings of PLC is expound ・
ed. Finally, take CP1H PLC as an example, using C++ Builder environment, realizes PLC control network communication code by Socket. The results show that the program can read and write PLC quickly through ethemet.
Key words: C++; OMRON PLC; Ethemet communication; FINS
1引言
PLC 在工业控制领域有着广泛的应用,随着信息技 术时代的来临,PLC 与上位机的通讯的需求越来越普遍
传统的PLC 通过RS-232C 串口进行通讯,由于该通讯方 式速度慢、传输距离短的限制,难以满足现代控制系统数
据量大、实时性强、长距离网络化传输的要求°巴为了解 决这个问题,欧姆龙出品了 CP1W-CIF41扩展接口单元, 该单元可以实现PLC 以TCP/IP 协议为基础的以太网通
讯。然而,这种以太网通讯采用了 FINS 通讯协议,与传 统的串口通讯协议有较大不同。笔者以CP1H 型号的PLC 为例,利用C++ Builder 编程环境通过socket 实现了该
PLC 与上位机的通讯。
2 FINS 协议介绍
以往的PLC 串口通讯采用PC-Link 协议,但是它的 传输速度慢,传送距离短,而且存在新型号的欧姆龙PLC 的某些寄存器无法支持读写操作的情况。为了适应高
速、长距离以太网传输的需求。Omron 公司开发了FINS 通讯协议用于工业自动化控制网络的指令和响应系统。 它可以实现该公司PLC 的网络通讯。通过发送FINS 指
令,上位机可以对PLC 的寄存器的值进行读、写操作。当 上位机发送FINS 指令后,PLC 将以FINS 数据帧进行应 答,使上位机可以确定操作是否成功完成,或者读取所需
要的寄存器地址铁
FINS 指令的数据帧包括FINS/TCP 头文件和FINS 数据帧2个部分。其中,头文件包含FINS 指令报头、指令 长度、命令代码、错误码4个部分,每个部分4个字节;数
据帧包括数据帧报头、PLC 节点号、上位机节点号、指令
(0101代表写,0102代表读),操作区域(80代表DM 区、30
代表CIO 区、89代表TIM 区)、寄存器启始地址、寄存器数
量、操作数。
66 | Techniques of Automation & Applications
通信与信息处理
Commun i cation and In f ormation Processing
《自动化技术与应用》2020年第39卷第12期FINS/TCP Header
报头长度命令错误码4字节4字节4字节4字节
FINS数据帧12~2012字节
图1FINS指令的数据帧结构
3通讯前基本设置
首先,将PLC的IP和上位机的IP设置为同一网段。本文中,笔者将PLC的IP设置为192.168.250.1(CP1W 的出厂默认IP),上位机IP为192.168.250.4。
然后,对型号为CP1H的PLC主单元的拨码开关进行设置。当使用插槽1,时,开关4要置为ON;当使用插槽2时,开关5要置为ON。设置完成后断电重新启动主单元,否则ERROR灯会常亮。
最后,利用CX-Programmer软件通过USB连接的方式,将插入以太网模块的串口插槽,波特率设置为115200,数据格式设置为“7,2, E”,模式选择HOSTLINK0
4FINS指令操作PLC
在利用FINS指令操作PLC的时候,首先需要上位机发送握手指令,待得到正常响应后,才可以对寄存器进行读、写操作。
4.1握手指令
采用TCP方式进行通讯,客户端需要发给服务器握手信号,等待服务器正常反馈,表示握手成功,才能正常交流数据。
发送握手指令"46494E53OOOOOO0COOOOO0OO00OOOOO 000000004”,其中0004为上位机IP的最后一位的16进制表示。
上位机接收PLC响应为“46494E5300000010 00000001000000000000000400000001”,代表握手成功。其中,0004代表上位机的IP的最后一位,0001代表PLC的IP的最后一位。
注意握手指令只能发送一次,多次发送会导致网络连接中断,而无法正常通讯。
4.2读取寄存器指令
在握手指令得到响应后,可以向PLC发送读取寄存器指令。例如我们需要读取DM区的连续2个寄存器的内容。
发送读取指令如下:
U46494E530000001A000000020000000080000200010 0000400000101820001000002”o
其中,1A代表指令长度,04代表上位机地址,0101代表读取指令,82代表DM区寄存器,0001代表起始地址,02代表读取寄存器个数。
上位机接收PLC响应为“46494E53000000 1A0000000200000000C00002000400 0001000001010000000400or,0004代表D1寄存器的值为4,0001代表D2寄存器的值为1。
4.3写入寄存器指令
在握手指令得到响应后,可以向PLC发送写入寄存器指令。例如我们需要向寄存器D2写入值1234。
发送写入指令如下:
"46494E530000001C000000020000000080000200010 00004000001028200020000011234”
其中,1C代表指令长度,04代表上位机地址,0102代表读取指令,82代表DM区寄存器,0002代表起始地址,01代表写取寄存器个数。
上位机接收PLC响应为“46494E5300000016 0000000200000000C000020004000001 000001020000”。代表写入成功。
5具体C++程序实现
笔者使用C++Builder进行通讯程序开发,利用开发环境提供的Socket接口实现在以太网下的高速稳定的数据读写功能。程序的网络访问类建立在套接字Socket 基础上,如TClientSocket类封装了创建TCP和UDP连接到网络的详细信息;函数SendBuf、ReceiveBuf提供了发送和接收数据的方法。具体的程序实现如下文所述。5.1创建网络连接
PLC为服务器端,上位机通讯软件为客户端。首先实例化TCP客户端mysocket。
mySocket=new SocketCUent_T(sPcIP,sPlcIP,nPort);
SocketClient_T::SocketClient_T(const String sPcIP, const String sIP,const int nPort)
{
Socket_C=new TClientSocket(NULL);
Socket_C->Port=9600;
Socket.C->A ddress=sIP;
Socket.C->O n C o nnect=On C o nnect;
}
其中,sPcIP为上位机IP,sPlcIP为PLC的IP,nPort
Techniques of Automation&Applications|67
为PLC的端口号(默认为9600)。
5.2TCP握手
由于每次发送寄存器操作指令之前,都需要发送一次握手指令,才能进行正常的读写操作。因此,笔者将握手指令添加到在OnConnect函数中,以保证每次连接创立后首先完成握手指令。
OnConnect(TObject
*ender,TCustomWinScx:ket
S c)cket) f
unsigned char Buffer1201;
String t;
String s="46494E530000000C000000000000000000 0000"+sPcPort;
for(int i=0;i<20;i++)
{
t=s.SubString(i
*2+1,2);
Buffer[i]=StrToInt("Ox"+t);//转换成16进制的整数
}
Socket_C->Socket->SendBuf(Buffer,20);
}
字符串s存FINS指令,由于FINS指令需要转换为16进制发送,故把s拆分为2个字节一组,每组前面加上Ox,再转换为整形,存到Buffer数组中后发送。
5.3读取PLC数据
笔者创立了String GetWords(const String sZone, const int nStartWord,const int nCount)函数,用于读取PLC数据。
//FINS指令
String sCMD="46494E530000001A0000000200000 00080000200"+sPlcPort+"0000"+sPcPort+"00000101"+ sZone+sStartWord+"00"+sCounts
/
/发送FINS指令,得到返回数据
String sGetValue=mySocket->GetData(sCMD);
//解析返回数据
由于返回的数据也是FINS格式的字符串,所以需要对其进行解析。
Void PhaseData(const String sCmd,const String sGetValue,const int nStartWord,const int nCount) {
String sMark="01010000";
if(sGetValue.Pos(sMark))
{
int nStartPos=sGetValue.Pos(sMark)+8;
int nItem=0;
String sZone=TransZone(sCmd)s//根据命令到相应的数据区域
while(nItem<nCount)
{
String sValue="Ox"+sRtn.SubString(nStartPos,4);
Int nValue=sValue.TolntDef(0)
PLCData[sZone+String(nStartWord+nItem)]=nValue5
nStartPos+=4;
nltem++;
}
}
}
接收FINS数据解析过程如上程序所述,首先到标志字符串,标志字符串后面的就是读取的有效PLC
数据。将数据字符串每4个分为一组,加上"Ox"前缀转化为整型数nValue,然后存储到相应的寄存器中。
5.4写入PLC数据
笔者建立了SetWord函数对PLC寄存器进行写操作。
SetWord(const String sCmd,const String sWord, const int nData)
{
String sCMD="46494E530000001C00000002000000 0080000200"+sPlcPort+"0000"+sPcPort+"0000010 2"+sCmd+sW o rd+"000001"+sData;
mySocket—>SendData(sCMD);
}
通过sCmd来区分需要操作的字所属区域,例如B0 代表CIO区、82代表DM区,89代表TIM区。sWord为操作字,sData为操作值,它们已经由整型数转化为了4位十六进制数。
6结束语
本文介绍了如何利用C++的嵌套字Socket进行网络编程,实现PLC和上位机的通讯,进行对PLC寄存器的读写操作。测试结果表明,该通讯程序可以有效、快
(下转第76页)
68|Techniques of Automation&Applications
表4对数据进行压缩URI/compressdata HTTP方法POST
参数data content待压缩数据algorithm采用压缩算法
返回值dest data content压缩后数据
表5获取数据压缩结果URI/compressdata HTTP方法GET
参数datacategory数据类别
time时戳
返回值dest data content数据
通过接口的实现,基于微服务的远程塔台具备了对外开放将接口及内部服务运作的能力,各个服务之间即相互独立又协调一致的运行,通过服务调度支撑起各个机场的远程塔台各个节点的应用。
5结束语
基于微服务架构的远程塔台系统充分考虑一个监控中心同时管制多个远端机场塔台的场景,从基于Docker 的容器技术出发设计微服务架构,将微服务架构根据图像处理、基础服务、第三方接口等分类进行分布式处理,通过REST及MQ接口来实现服务之间的调用,达到了分布处理、分布运行的效果,提高了系统的可靠性,有效的降低了各个节点之间的耦合性。
参考文献:
[1]徐国标,侯明利.增强现实技术在远程塔台管制中的应用[J].中国民航飞行学院学报,2019,2(30):66-70
[2]丁兆青,董传良.基于SOA的分布式应用集成研究[J].计算机工程,2007,33(10):246-248.
[3]钟陈星,李杉杉,张贺,章程.限界上下文视角下的微服务粒度评估【J/OL].软件学1-15[2019-06-05].
[4]张建平,项悦,张平,王秋萍.欧洲远程塔台运行概念及技术要求对我国的启示[J].航空计算技术,2018,48⑹=122-126.
[5]胡耀东.基于微服务的电商系统的设计与实现[D].武汉:华中科技大学,2018.
[6]章仕锋,潘善亮.Docker技术在微服务中的应用[J].电子技术与软件工程,2019(4):164.
[7]吴斌烽.基于微服务架构的物联网中间件设计[J].计算机科学,2019,46(S1):580-584,604.
[8]何桐.微服务架构应用前景研究[J].计算机产品与流通, 2019(7):46.
[9]裴宏祥,于晓虹.基于微服务架构的系统设计与开发[J].中国科技信息,2019(10):91-92.
write的返回值[10]杨祥洪.基于容器的操作系统应用兼容技术研究[D].长沙:国防科学技术大学,2015.
111]李春林,刘正军,王冶,徐锐.一种改进的基于Docker的网络安全实验平台构建方法[J].通信技术,2019,52(4):927-932.
[12]袁慧,张轩.Docker框架下的虚拟化应用平台建设研究[J].自动化与仪器仪表,2019(3):39-42.
[13]刘殊场,张曼怡,曹强.Docker动态调度算法的设计与实现[J】.计算机工程与科学,2018,40(12):2112-2119.
[14]刘胜强,杜家兵,庞维欣.基于Docker虚拟化技术性能优化分析[J].自动化与仪器仪表,2018(11):1
75-177.
[15]张琦.基于Docker的CaaS管理平台架构研究与设计[J].计算机应用与软件,2018,35(11):33-41,54.
作者简介:杨璐(1987-),女,讲师,硕士研究生,研究方向:航空电子、空中交通运输、导航控制.
(上接第68页)
速、稳定地对欧姆龙PLC进行读写操作,在工业控制工程上具有较好实用价值。
参考文献:
[1]曹卫,史旺旺,陈虹.OMRON PLC在以太网中的通信及实现[J].测控技术,2004,23(12)-50-51.
[2]燕科帆,朱厚耀,林贺邦,等.基于MFC的计算机与PLC 以太网通讯软件开发[J].机电工程技术,201&47(10):138-141.
[3]张雪平.OMRON PLC网络与通信[J].微计算机信息,2005,21(4)=62-63.
[4]陈雪娇,韦莉莉.基于C#的0MRON PLC以太网通讯接口实现[J]•自动化技术与应用,2018,37(1):52-55.
作者简介:陈,«(1985-),男,工程师,研究方向:工业测控软件开发与通讯接口开发.
76|Techniques of A utomation&Applications
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论