基于Modbus协议的终端通讯系统的开发
2021-01-19王学华白志城申楷赟
刘 鑫,王学华*,白志城,申楷赟,王 刚
(1.武汉工程大学 材料科学与工程学院,湖北 武汉 430205; 2.纵横皆景(武汉)信息技术有限公司,湖北 武汉 430204)
0 引 言
智能泊车系统是将先进的图像识别技术与工业自动化技术相结合[1-2],通过计算机的数据计算与图像处理,对进出智能车库车辆的存放、测量、收费、引导为一体的全方位管理系统[3]。该系统以用户个人信息作为车辆出入车库的凭证,用先进的激光雷达测距技术和高清号牌机获取车辆信息[4],再通过控制装置控制机械手将车辆抓取到托盘小车后引导至指定停车位,实现用户的停取车需求。智能泊车库因其稳定的通讯和强大的数据库管理每一个用户及其车辆的信息,解决了现有停车场存在的安全隐患[5]。
PLC因具有灵活性好、通用性强和性价比高等优点使其在工业自动化工程中应用广泛[6]。在智能泊车库中选用PLC为核心建立运动控制系统可以有效提高系统的自动化程度和安全性,但由于PLC单独处理数据能力较差[7],所以需要与上位机结合弥补这些缺陷[8]。如PLC在操控激光雷达对目标物体与周边信息进行感知与采集的过程中,PLC无法对相关数据进行处理,所以通过与上位机结合,建立可以实现数据交互的通讯模块将数据传输到上位机进行处理。
PLC常用的通信协议有MPI、PROFIBUS、工业以太网以及串口通信等[9],其中基于工业以太网的Modbus通讯协议具有诊断能力强、数据传输量大、成本低等特点[10],主要用于对PLC寄存器中数据读写等操作,现已被众多机械设备产品支持并使用[11],所以选用Modbus协议作为系统的通讯协议。而在PLC与终端机数据交互过程中,传统的XML技术在Modbus数据解析上效率较低,因此在数据传输应用开发中引用Json技术将Modbus数据封装成为Json对象,通过以太网传输可以有效提高传输效率。该文通过对Modbus协议和Json技术的解析,设计了一种以Modbus通信协议与Json技术为纽带,利用上位机(终端机)与PLC进行数据传输实现车库停取车功能的系统。
1 智能终端系统架构
1.1 系统架构
智能终端系统主要分为数据处理模块、数据传输模块和数据采集模块。数据处理模块主要是终端机,它的主要功能是发送和接收指令以及对系统信息进行处理。数据采集层主要有号牌机、激光雷达、地感线圈、光电传感器等,它的主要功能是采集外部信息如车辆位置坐标、号牌等。数据传输模块是数据采集模块与数据处理模块进行数据交互的重要媒介。在实际应用中由于用户可以操作多台终端机,所以PLC需要通过以太网接入交换机,通过交换机可同时与多台终端机进行数据传输且互不干扰。通讯流程为用户在终端机上输入指令,指令通过数据交互模块发送至PLC,PLC对指令进行分析处理后,操控数据采集层开始数据采集并将数据传送至终端机,实现了终端机与PLC之间的数据传输。系统数据传输的架构如图1所示。
1.2 智能终端功能
自助终端机是用户在智能泊车库中完成车辆停取的主要操作设备。作为无人值守的自动泊车终端系统需具备以下主要功能:停车功能、取车功能和支付功能。
停车功能主要包括用户信息认证、车辆信息读取与数据库数据同步等。用户将车辆驶进停车场后,在终端机上选择停车操作,输入账户信息,终端机系统进行用户和车辆信息验证,验证通过后打印停车凭条,发出停车动作指令,泊车系统自动完成停车操作。
图1 智能终端数据传输系统架构
取车功能主要是验证用户信息以取出车辆。用户只需将停车凭条放在终端机上的扫描设备进行识别[12],终端系统根据扫码信息进行身份认证,认证通过则可以取出车辆,并显示停车时长和费用。
支付功能主要用于完成取车费用的支付和发送道闸动作指令。取车信息验证通过后,终端显示支付界面,用户完成支付后,终端发送支付完成信息和道闸动作指令,泊车系统随即会将车辆取至待取区域,用户即可将车辆驶出车库,完成取车过程。
2 Modbus协议的Json格式
Modbus通讯协议是一种应用层协议,连接在不同网络设备之间提供服务器与客户端通信,其具有支持串口(主要是RS-485总线)和以太网的功能,协议包括Modbus RTU,Modbus ASCII和Modbus TCP三种[13]。该系统采用基于以太网的Modbus TCP协议,属于客户端/服务器模式进行通信,客户端发出数据请求消息,服务端收到消息后就发送数据到客户端以响应请求,客户端确定了服务端响应后表示连接已建立。
Modbus TCP数据结构如图2所示,基于TCP/IP协议的Modbus数据格式包含通信报头和协议数据单元。通信报头包含事务标识符(2字节)、协议标识符(2字节)、长度(2字节)和单元标识(1字节),事务标识符在每次通信完成会进行累加以区别不同的通信报文;由于该文采用的是Modbus TCP协议,所以协议标识为0×0000;长度表示数据长度,单位为字节;单元标识符代表设备地址,该文拟用0×02作为终端标识。而协议数据单元包括功能码(1字节)和数据集(n字节),功能码用于指出要求进行的操作,该文主要运用功能码0×03和0×04,0×03代表读取寄存器数据,0×04代表在指定地址寄存器中写入数据;数据集即传输数据是一个可变字段,每个字节8 bit,字段长短根据数据大小决定。
图2 Modbus TCP消息帧的数据结构
Json对象的数据结构为键值对结构,即“key/value”集合。key为对象的属性,可以是数据类型,也可以是一个数组,而value表示其对应的值,该文采用的Json格式表示为:
{"terminal”:“0001”,
“status”:“0001” ,
“Parking allowed”:“ 0002”,
“Voucher number”:“1423”,
“Parking fee”:“0034"}
从以上结构可以看出,Json格式适用于本系统Modbus协议指令的数据格式,合理地使用Json处理终端机与PLC之间传输的数据,可以有效提高Modbus协议的通讯效率,并且可以简化应用程序的开发。
3 通讯程序设计
终端机上的通讯程序主要完成以下任务:初始化通讯程序、发送通讯请求、检验数据帧是否正确、执行读写指令、接收返回结果。程序流程为:终端机主动联络PLC,首先初始化通信模块,然后发送握手信号,其中包括IP地址、端口号等,PLC接收到地址后会先与本身IP比较,如果地址无误则回应终端机确认连接,当终端机接收到PLC确认信息后,则表示通信已经建立,同时可以读写PLC寄存器中的数据,通讯流程如图3所示。
3.1 终端机通讯程序
3.1.1 连接PLC
因为泊车库设备采用以太网互联,所以需要根据PLC配置设置参数。在连接程序中,网关的IP参数设为127.0.0.1,端口号为502,同时回调函数返回连接状态值,程序如下:
IPAddress[]IpAdd=Dns.GetHostAddresses ("127.0.0.1");// IP地址
IPEndPoint joint=new IPEndPoint(Ip Add[1],502) ;//端口号
AsyncCallback Value=new AsyncCal lback (ConnectCallback1);//回调函数
AsyncResult connResult =s1.Begin Co nnect(joint,callback,s1);
connResult.AsyncWaitHandle.WaitOne(50,true);
该网关可以自动诊断与PLC的连接,终端程序会定时发送报文至PLC,PLC则会发送返回值以确定连接正常。设定时间为50 ms,如果终端程序没有接收到检测数据,则表示通信连接异常。如果连接正常,便可以进行读写操作。
图3 通讯流程
3.1.2 读取寄存器
对PLC寄存器中指定地址的DB块进行数据读写需要指定地址和读取数据长度,根据通信协议发送和读取指定格式数据,并转成文本格式保存在本地。
OperateResult
if (read.IsSuccess)
{
Value_List.Text = "";
String returned_value=ByteToHexString (re ad.Content);
}
else
{
toolStripStatusLabel1.Text="读取失败:"+read.ToMessageShowString();}
3.1.3 写入寄存器
PLC_Write_value Retured_value_write=DeserializeJsonToObject
writeResultRender(busTcpClient.WriteRegister(ushort.Parse(Retured_value_write.Adress),short.Parse(Retured_value_write.Value));
Retured_value_write.Adress);写入数据
3.1.4 转Json格式
ArrayList array=GetSeparateSubString(str, 4);
int Read_adress=Convert.ToInt32(addr ss);
Retured_v.Clear();
foreach (string arr in array)
{
PLC_Retured_value Retured_value=new PLC_Retured_value();
Value_List.Text +="DB地址" + Read_adress + ": "+ arr + " ";
Retured_value.Adress=Read_adress. ToStri ng();
Retured_value.Value=arr;//实体集合序列化和反序列化
Retured_v.Add(Retured_value);
Read_adress++;
}
3.2 PLC通信程序
该系统PLC选用西门子S7-1200系列,S7-1200系列PLC采用模块化结构,各模块都具有很好的可扩展性,可搭载中央处理器(CPU)、电源、I/O模块以及通讯模块[14]。博途(TIA)是西门子工业常用的集成自动化软件,可对PLC进行组态、编程和调试。以太网连接设备后,使用TIA V14软件找寻到PLC设备,选中PLC点击下载硬件和软件信息,PG/PC接口类型选择PN/IE[15]。初始化PLC,在通信模块中选择MODBUS_SERVER功能块,并添加至PLC程序集,并按图4所示的方式设置通讯参数和数据块。
图4 Modbus通信模块
在PLC程序中添加DB块,定义了终端机与PLC需要传输的数据,其中数据名称、数据类型和偏移量等如表1所示,终端机程序可以通过地址和偏移量读写这些数据值。
表1 PLC中DB块的数据结构
4 数据通讯测试
4.1 单组数据通讯测试
在搭载Windows 64位操作系统的计算机上进行开发与通讯测试,系统测试在无干扰的环境下进行。在测试过程中,使用Modbus Slave软件模拟现场PLC情况,在Modbus Slave上添加数据内容,根据表1定义的数据名称及大小如图5所示,同时选择连接方式为Modbus TCP/IP,设定IP地址为127.0.0.1,端口号为502。终端程序通过与Modbus Slave软件连接,通过读写表中数据测试通讯程序性能。
图5 Modbus Slave数据界面
在通讯程序上输入IP地址和端口号,运行程序后与Modbus Slave建立连接,由于有18个模拟数据,所以在程序上设定DB块地址为0~17位,设定读取时间间隔为100 ms,得出读写数据结果。通讯程序中,利用Stopwatch函数计算出读写数据时间,通过多次反复测试,测试结果如表2所示。
表2 单组数据通讯测试结果
4.2 多组数据通讯测试
多组数据通讯测试是在单组数据通讯测试基础上,在Modbus Slave上更改数据类型与数据值,同时更改通讯数据量,在相同的环境下进行测试。设定五组数据,每组测试数据取50次测试的平均值,测试结果如表3所示。从统计结果可以看出,在通讯数据不同的情况下,通讯程序的读写操作误差为0,单次读写时间误差不超过1 ms,并且程序运行过程中占用计算机内存不超过40 MB。
表3 多组数据通讯测试统计
5 结束语
通过对ModbusTCP协议的解析,采用C#编程语言开发了基于ModbusTCP通信协议的终端通讯系统,并对ModbusTCP通讯数据封装成Json格式传输,实现了终端机与PLC之间的实时通讯和数据传输。该系统在与Modbus Slave软件测试结果表明,数据量在150个以内终端通讯系统通信正常、运行稳定,验证了系统的可行性,达到了技术指标。