编译型PLC Modbus协议的研究与实现
2014-02-11令狐钊杨旭东陈伦军
令狐钊,杨旭东,陈伦军
(1.贵州大学机械工程学院,贵州贵阳 550025;2.贵阳永青仪电科技有限公司,贵州贵阳 550025)
编译型PLC Modbus协议的研究与实现
令狐钊1,2,杨旭东1,陈伦军1
(1.贵州大学机械工程学院,贵州贵阳 550025;2.贵阳永青仪电科技有限公司,贵州贵阳 550025)
在编译型PLC的研发过程中,为使PLC的通信具有通用性和开放性,采用了Modbus协议。针对中断数据收发会占用大量CPU的问题,以及几种常用PLC通信方式的优缺点,通过对Modbus协议的研究,在ARM技术和操作系统的支持下,结合编译型PLC的特点,提出了一种中断组合DMA的数据收发新方法和一种多任务通信方法,实现了一种实时性较好、CPU占用量较少的适合于编译型PLC串行链路上的Modbus服务器通信。测试结果表明了程序的正确性。
Modbus;编译型PLC;DMA;操作系统
目前国内外的主流PLC为解释型PLC,原因在于其跨平台性好,在线编程能力强,但是执行效率低[1],资源占有量大,实时性低,而且PLC新兴之处并未形成标准,造成了各品牌PLC自成系统。随着IEC61131标准和工业场合对实时性要求苛刻等原因,基于IEC标准的编译型PLC逐渐成为国内外研究课题。在通信方面,各品牌PLC基于自身利益的考虑,基本上都开发有专有通信协议,而面对各种新协议的不断产生,用户往往无所适从,担心会被某些PLC厂商钳制。Modbus通信协议是Modicon公司推出的一种公开的工业通信协议,该协议得到了施耐德、西门子、三菱、松下等大型PLC厂商支持,同时为各种仪器仪表广泛支持。基于以上考虑,为使自主研发的编译型PLC的通信具有通用性和开放性,提供了对Modbus的支持。本文采用STM32F107VC芯片,在实现了RS-485等硬件电路的基础上,结合编译型PLC的特点,综合多任务处理技术,对协议的研究和实现提出了看法和实现方法。
1 编译型PLC及Modbus协议简介
编译型PLC不同于解释型PLC,编写符合编译型PLC的Modbus通信,首先应熟悉编译型PLC的特点和Modbus协议。
1.1 编译型PLC
编译型PLC,从编译原理的角度充分体现了与传统解释型PLC的不同之处。用户编写的程序在上位机上直接编译,一步到位,不需要下位机再进行解释。正因其“一次编译,多次执行”的特点,一方面减轻了PLC本体需要装载解释系统的负担,提高了效率,降低了资源占有量;另一方面增加了PLC软硬件组合的灵活性。图1为编译型PLC梯形图程序编译流程。第一次编译,把用户梯形图程序逻辑编译成标准C文件,以方便与库文件一起进行GCC调用编译;第二次编译,即GCC编译以生成可执行文件,编译后便可下载到PLC本体中以运行。其中库文件一般包括两部分,一部分是驱动程序,用于读写I/O,初始化I/ O等;另一部分是功能库函数,例如移位、PID等功能函数。若为带操作系统的PLC,则库文件中还包括操作系统。本文Modbus协议程序即放置于库文件中,用户编写程序时,调用即可。
图1 梯形图程序编译流程图
1.2 Modbus协议
Modbus是一种单主站、多从站的请求/应答协议[2-3]。如图2为通用Modbus帧。PDU为数据单元,包括功能码和数据两部分。功能码用于指示所要执行的操作。数据域包含完成指定操作所需要的附加信息。PDU上加上地址域和差错校验构成了ADU,即应用数据单元。地址域用于标识服务器,服务器用于确定数据帧是否是发送给自己的。差错校验码用于确认收发数据的正确性。
图2 通用Modbus帧
2 软件实现
Modbus通信过程是主站发送数据给从站,从站在接收数据后,对接收帧进行处理,处理后若非广播帧,则进行回复帧构建,并回复给主站。如图3为Modbus服务器通信流程。服务器通信的实现包括:数据接收和发送、帧前处理后处理、PDU处理。为使程序各部分耦合性降低,以模块化的方式来实现,模块之间提供相应接口。RTU模式和ASCII模式因数据流格式不一样,在数据的接收和发送,以及前后处理都不一样。但是,它们可以有一样的PDU处理函数,只需把前处理后的数据统一为RTU的八位二进制格式即可。下文先阐述RTU模式和ASCII模式数据接收和前后处理,然后阐述PDU处理,最后探讨多线程下Modbus通信的实现。
图3 通信流程图
2.1 RTU模式
数据以报文帧方式发送和接收,如图4为RTU数据流格式。一帧数据以非空闲帧作为帧头的标记,3.5个字符作为帧尾标记。
图4 RTU数据流
2.1.1 数据收发
数据的收发,通常采用中断方式来实现。该方式优点是配置简单,缺点是占用CPU过多。ARM最新Cotex系列芯片支持DMA(直接存储器访问)。根据RTU传输模式的特点,最终采用DMA组合空闲帧中断、接收中断的方式,而发送则完全采用DMA发送,具有CPU占用小,速度快的优点。图5为RTU数据接收程序框图。
RTU模式以3.5个字符作为帧的结束,作为帧与帧之间标识。其实现算法为:
图5 RTU数据接收程序框图
其中:MBbaud为串口波特率。因高速传输时隐含着大量中断管理,从而导致CPU负担加重,所以在当波特率大于19 200 bit/s时,定时器值设为1.75 ms。
2.1.2 前后处理
前处理的工作是确定数据是否发送给本机,以及进行CRC校验确认传输数据的正确性。确定数据是否发送给本机,通过地址的判断来确定。后处理的工作是确认是否广播帧,如果不是则给回复帧加上CRC校验码,并把数据移交给DMA。前后处理分别提供两个函数头,如下:
2.2 ASCII模式
ASCII模式通信流程和RTU模式类似,不同之处在于报文帧数据流格式。图6为ASCII数据流格式。
图6 ASCII数据流
2.2.1 数据收发
ASCII模式以“:”字符标识数据帧的起始,CR(回车符“ ”)和LF(换行符“ ”)作为帧尾标识。如果采用DMA方式来接收,则必须通过查询标识字符来识别帧头和帧尾,所以,采用接收中断的方式比较合理。其实现可采用状态机的方式,如图7所示。而对于数据的发送,采用DMA方式发送即可。该模式对定时器要求并不高,协议规定容许有1 s的延时,但为了适应各种场合对实时性的要求,该延时值容许用户配置。
图7 ASCII接收状态机
2.2.2 前后处理
为方便PDU数据处理,在发送前后把数据转换为八位二进制格式。前处理程序逻辑为:接收之后先对把地址转换以确认地址是否正确,如果正确则全部转换,并进行LRC校验。后处理给要回复帧加上':'字符,然后依次把处理好的数据转换为字符形式,并添加到回复帧上,然后给回复帧加上转换后的LRC校验码,最后加上“ ”、“ ”字符。前后处理分别提供两个函数头,如下:
2.3 PDU处理
PDU处理是通信的目的内容。归纳协议,得图8,可知其处理过程是根据数据帧的功能码和数据域的地址信息对数据进行读写操作。基于此,PDU处理要实现三部分内容:数据的读写操作;相应功能码的功能函数;提供给数据处理阶段主程序的接口函数。三者的程序逻辑关系是:接口函数根据功能码查找调用哪个功能函数,功能函数先检查PDU的读写地址和读写数量信息,在信息正确的情况下进行读写操作,该过程若有错误则返回相应异常。
图8 PDU处理流程
离散输入点和输入寄存器只可读,线圈和保持寄存器可读且可写。所以,分别实现四个读写函数:读取离散输入、读取输入寄存器、读写线圈、读写保持寄存器,而其返回参数是枚举类型的异常码。
各功能函数根据PDU信息调用一次或两次其中的一个读写函数,返回参数异常码。以功能0x17(读写多个寄存器功能)为例,定义该功能码功能函数的函数头如下,其它功能码的功能函数头与其相似,仅函数名不同,如下:
MBException SMBFunc0x17RWHoldings(U8* frame,U16*Len);//0x17功能函数
采用用数组和函数指针的方式来查找并调用功能函数,接口函数和数组定义如下:
MBException SMBPDUProcess(U8*pframe,U16*pLen)//接口函数
本文实现了实现了十一种功能码,满足PLC需求。在PDU处理实现的基础上,组合前后出理,对RTU模式和ASCII模式,将分别构成下面两个函数。
2.4 多线程下的Modbus通信
传统PLC是一个大循环扫描,其通信方式有两种:以中断的方式执行;非中断方式执行。中断的方式是通信数据到达,程序立刻跳转到中断中执行,适合于较高速度的通信场合,缺点是占用较多CPU。非中断方式是把通信逻辑放到扫描程序中,当扫描到了后即执行通信,这种通信方式适合于低速度通信场合,但是在用户程序量比较大时,延时明显。本文将提出采用多任务操作系统情况下的第三种方法:把通信单独做为一个任务来处理,PLC程序采用多任务方式工作,设置通信任务的优先级可以适应对通信任务的中低高速要求。
以RTU模式为例,若采用中断方式,只需将SMBRTUProcess()组织到定时器中断中即可;若采用非中断方式执行,只需将SMBRTUProcess()放到大循环中即可。本文也提出的第三种方式的实现方法是在main()函数中新建一个任务用于Modbus通信,该任务执行条件是数据是否到达。其通过在数据接收完时发送数据接收完成信号量给操作系统等待任务调度以实现。其中通信任务的优先级容许用户配置。本文采用的操作系统是CoOs,程序源码如下:
表1 异常测试结果
3 测试
上位机RS-232转RS-485连接到PLC,利用Modbus poll的CommunicationTraffic显示往返数据,如下以0x03为例,分别为两种模式测试值。
分析结果,一方面测试软件没显示错误,另一方面,对比往返数据,显示了数据的正确性。设置通信间隔时间为20 ms,长时间读写数据,运行结果表明软件的正确和可靠性,速度方面也满足要求。
对异常的测试也是至关重要的。下文仅表述在RTU模式下测试功能码0x03的部分异常回复。测试结果见表1,表明了异常码显示的正确性。
4 总结
基于Modbus协议在PLC领域的通用性,文章结合编译型PLC的特点,分析和实现了该协议在串行链路上的服务器通信。通过合理利用DMA的方式实现了RTU的串口数据收发,有效释放了中断CPU;通过状态机的方法实现了ASCII模式的数据接收;通过PLC通信方式的总结,结合编译型PLC的特点提出了基于多任务下的通信实现方法。测试验证了程序设计的正确性。最终使得自主研发的PLC具有了通用总线的功能,具有很好的实用性和参考价值。
[1]李慧强,程广河,王茂励,等.基于ARM的编译型可编程序控制器系统研究[J].自动化与仪表,2009,24(10):42-44.
[2]GB/T 19582.1-2008.基于Modbus协议的工业自动化网络规范第1部分:Modbus应用协议[S].
[3]GB/T 19582.2-2008.基于Modbus协议的工业自动化网络规范第2部分:Modbus协议在串行链路上的实现指南[S].
Research and Implementation of Modbus Protocol for Complied PLC
LINGHU Zhao1,2,YANG Xu-dong1,CHEN Lun-jun1
(1.School of Mechanical Engineering,Guizhou University,Guiyang 550025,China;2.Guiyang Yong Qing Yi Dian Ke Ji Co.,Ltd.,Guiyang 550025,China)
In order to make the communication of complied PLC which is researched and implemented to be compatible and open,Modbus protocol is adopted.Aiming at data transmission through interrupt will take up a lot of CPU time,and the advantages and disadvantages of several kinds of PLC communication mode,through the study of Modbus protocol,with the support of ARM technology and RTOS,and according to the characteristics of compiled PLC,a new combinational way of DMA and interrupt,and a effective multitask way is proposed.Finally,a kind of serial link Modbus communication that is higher real-time,lesser CPU occupation,and suitable to complied PLC is implemented.The test results turned out that the correctness of the program.
Modbus;complied PLC;DMA;operating system
TP274
:A
:1009-9492(2014)12-0210-05
10.3969/j.issn.1009-9492.2014.12.054
令狐钊,男,1988年生,贵州人,硕士研究生,工程师。研究领域:测试与数字控制技术。
(编辑:王智圣)
2014-07-17