Codesys语言编程实现ModbusTcpServerCoDeSysprogramminglanguagetoachievetheModbusTcpServer蒋勇飞(施耐德电气上海200072)中文摘要:PLC_OPEN是工业自动化编程领域的一个标准,Codesys是德国3S公司开发的软件系统平台,它是完整支持PLC_OPEN标准的软件系统平台(即IEC61131-3标准)。支持标准IL、ST、FBD、LD、CFC、SFC六种PLC编程语言,用户可以在同一项目中选择不同的语言编辑子程序,功能模块等。目前许多公司的自动化控制器都是基于这个平台开发的,例如施耐德,倍福,ABB,易福门,派芬,和利时等。使用Codesys编程实现ModbusTcpServer的功能,方便了客户使用带以太网接口的控制器和HMI或PC的通讯。降低了客户的成本,增强了系统使用的灵活性。中文关键字:以太网接口,通讯协议,人机界面,ModbusTcp服务器,CodesysAbstract:PLC_OPENastandardinthefieldofindustrialautomationprogrammingCodesysGermany3Shasdevelopedsoftwareplatform,whichisthethecompletesupportPLC_OPENstandardsoftwareplatform(ie,IEC61131-3standard).SupportsstandardIL,ST,FBD,LD,CFC,theSFCsixPLCprogramminglanguages,usercanthesameproject,chooseadifferentlanguageeditingsubroutine,functionmodule.Manyautomationcontrolleraredevelopedbasedonthisplatform,suchasSchneider,Beckhoff,ABB,Ifm,Fin,andHollysys.TouseCodesysprogrammingModbusTcpServer,andconvenientforcustomerstousethecommunicationcontrollerandHMIorPCwithanEthernetinterface.Reducedourcosts,enhancetheflexibilityofthesystem.Keywords:Ethernetport,Communicationprotocol,HMI,ModbusTcpServer,Codesys引言ModbusTcp应用层协议及数据帧介绍Modbus-TCP已成为当今开放的互联网标准之一,并为互联网标准的组织IETF(互联网工程任务委员会)认可。由于Modbus协议部分未经改动,众所周知的Modbus服务和对象模式依然有效,只是将它的作为传输层协议移植到TCP/IP上。ModbusTcp应用层的协议是独立于通讯媒介,根据客户/服务器原理组织的。客户发送请求帧来请求服务,服务器回应响应帧。请求帧和响应帧包含了参数和/或数据。在图1中显示了标准ModbusTcp帧格式。标准的Modbus通讯中从站地址和CRC校验的处理优先于功能码,但在ModbusTcp中地址和校验由底层的Tcp协议完成。ModbusTcp和Modbus_RTU在数据报文的结构上存在的差异是报文帧头由MBAP替换了SlaveID。MBAP由7个字节组成,并且出现在每个ModbusTcp信息帧的头部,这7个字节分别由TransactionIdentifier(2个字节,传输标志),ProtocolIdentifier(2个字节,协议标志),Length(2个字节),UnitIdentifier(一个字节,设备站号)。图1:使用Modbus-TCP,命令和用户数据可不经任何修改而封装在TCP/IP的数据容器中图2:Modbus-TCPADU在经过以太网TCP/IP协议封装之后的结构1.实现MODBUS_TCPSERVER的硬件及软件配置1.1该项目选择LTI公司的MOTIONONEPAC控制器(型号:LACP242,INTEL_ATOMCPU,1.1GHZ)硬件资源:ETHERNET10/100M接口,软件CODESYS2.3软件平台(图3)图3.Codesys2.3软件配置平台1.2选择3S公司CODESYS2.3软件平台内的TCP/IP通讯库函数SyslibSockets.lib,同时主要使用到的功能函数如下:●SysSockInetAddr(ip):绑定指定的以太网接口的IP地址,控制器本体上的以太网端口的IP地址●SysSockHtons(port):绑定以太网端口,MODBUS_TCP通常使用502端口●SysSockCreate(SOCKET_AF_INET,SOCKET_STREAM,0):Tcp/IPSocket的创建●SysSockBind(socketId,ADR(),SIZEOF()):Tcp/IPSocket绑定指定端口和IP地址●SysSockListen(socketId,255):Tcp/IPSocket进行端口监听●SysSockSelect(SOCKET_FD_SETSIZE,ADR(),0,0,ADR()):TCP/IPclient的选择●SysSockAccept(socketId,ADR(),ADR()):TCP/IPSocket接受client设备的链接●SysSockRecv(SocketHandle,ADR(),SIZEOF(),1):TCP/IPSocket接收client设备的数据包●SysSockSend(SocketHandle,ADR(),(),1):TCP/IPSocket返回数据包,发送至Client设备●SysSockClose(socketId):关闭TCP/IPSocket。1.3MODBUS_TCPserver的创建过程创建MODBUS_TCPserver的过程主要分为以下几个步骤:1.3.1TCP/IPSocket库文件的安装在CODESYS2.3软件平台的librarymanager栏目下添加SyslibSockets.lib。之后则可以正常调用以太网通讯函数。1.3.2申明各种通讯参数变量及数据结构,例如MODBUS_TCPSERVERIP地址及端口,收发数据的数组:Var_GlobaladdressPointer:POINTERTOSOCKADDRESS;address:SOCKADDRESS;ip:STRING:='192.168.39.100';(*控制器本体IP地址*)……port:WORD:=502;(*MODBUS-TCP端口*)objectArray:ARRAY[0..6]OFREAL;tcp_connect_state:BOOL;(*TCP/IP连接状态字*)protocol_id:INT;(*协议标志ID,modbusid=0000*)device_id:INT;(*设备站号ID*)END_VAR1.3.3MODBUS_TCPSERVER主程序说明。主程序结构框图及部分程序如下:主程序通过调用SyslibSockets.lib库内部的Sockets函数完成端口绑定,并实施对应端口的监听,当ModbusTcp客户端请求建立连接时候,服务器端建立连接,并进行数据的交换读写,为了便于判断客户端和服务器端的连接状态,程序做了实时的报文刷新,当通讯建立连接之后,服务器端没有接收到新的报文,且维持一段时间后,则按照通讯中断处理,关闭Sockets,并重新初始化参数,服务器端再次进入监听状态,这种控制模式可以辨识网络物理断线和客户端异常断开这些情况。address.sin_addr:=SysSockInetAddr(ip);IFterminate=FALSETHENCASEtcp_stateOF0:socketId:=SysSockCreate(SOCKET_AF_INET,SOCKET_STREAM,0);IFsocketIdSOCKET_INVALIDTHENSysSockSetOption(socketId,SOCKET_SOL,SOCKET_SO_REUSEADDR,ADR(dwValue),SIZEOF(dwValue));tcp_state:=10;END_IF10:bResult:=SysSockBind(socketId,ADR(address),SIZEOF(address));IFbResultTHENtcp_state:=20;END_IF……50:SocketHandle:=SlaveSocketList.fd_array[TCPindex];IFSocketHandle=socketIdTHENdiSize:=SIZEOF(Address);SocketHandle:=SysSockAccept(socketId,ADR(Address),ADR(address));tcp_state:=100;END_IF100:(*SysSockSend(socketId,ADR(send),SIZEOF(send),1);*)SysSockRecv(SocketHandle,ADR(receive1),SIZEOF(receive1),1);……IFprotocol_id=0ANDdevice_id=0ANDreceive1[1]0THEN(*modbus_tcp,protocol_id=0*)frame_process();tcp_state:=120;END_IF;END_CASE;END_IF;1.3.4创建MODBUS_TCPSERVER报文处理程序(部分子程序)当服务器端接收到客户端的报文之后,经过了ModbusTcp协议ID和功能码有效性判断之后,调用报文处理程序,在报文处理程序中,主要是根据01,02,03,04,05,06,15,16MODBU-TCP读写字,读写位功能码分别进行处理。例如进行写寄存器功能的处理时,先判断写入寄存器的起始地址和写入寄存器个数,再进行带地址偏移的赋值,在赋值过程中要进行高低字节的转换,以保证数据的正确性。Frame_process(*MODBUS_TCP报文处理*)IF(send_do=FALSE)THENCASEinput_byte1[2]OF03:(*读寄存器*)……address_temp:=SHL(BYTE_TO_INT(input_byte1[3]),8)+(BYTE_TO_INT(input_byte1[4]));……FORmove_to_send:=address_tempTOaddress_temp+(length_temp)*2DOoutput_byte[4+move_to_send-address_temp]:=mw_area[move_to_send+address_temp+1];END_FOR;……END_CASE;END_IF;2.MODBUS_TCPserver的验证使用在MODBUS_TCPsever通讯程序完成之后,通过wireshark以太网抓包软件分析MODBUS-TCP报文,并使用Easybuilder800触摸屏软件实现了触摸屏和PAC控制器的MODBUS_TCP通讯。图4.wireshark以太网抓包软件分析的MODBUS-TCP报文图5.使用Easybuilder800触摸屏软件配置通讯接口图6.使用Easybuilder800触摸屏软件监控控制器变量状态结论使用Codesys软件平台的sockets编程可以实现PAC控制器和任意公开协议的以太网设备进行通讯,Codesys内部的库函数的功能丰富,PAC控制器通讯编程的灵活性远比PLC强大。参考文献:[1]郝晓弘,刘忠.基于Modbus/TCP工业以太网的监控系统的设计与实现[J].仪器技术及传