要实现Modbus RTU通信,一、需要STEP 7-Micro/WIN32 V3.2以上版本的编程软件,而且须安装STEP 7-Micro/WIN32 V3.2 Instruction Library(指令库)。
Modbus RTU功能是通过指令库中预先编好的程序功能块实现的。
Modbus RTU从站指令库只支持CPU上的通信0口(Port0)基本步骤:1. 检查Micro/WIN的软件版本,应当是STEP 7-Micro/WIN V3.2以上版本。
2. 检查Micro/WIN的指令树中是否存在Modbus RTU从站指令库(图1),库中应当包括MBUS_INIT和MBUS_SLAVE两个子程序。
如果没有,须安装Micro/WIN32 V3.2的Instruction Library(指令库)软件包;1. 西门子编程时使用SM0.1调用子程序MBUS_INIT进行初始化,使用SM0.0调用MBUS_SLAVE,并指定相应参数。
关于参数的详细说明,可在子程序的局部变量表中找到;调用Modbus RTU通信指令库图中参数意义如下:a. 模式选择:启动/停止Modbus,1=启动;0=停止b. 从站地址:Modbus从站地址,取值1~247c. 波特率:可选1200,2400,4800,9600,19200,38400,57600,115200d. 奇偶校验:0=无校验;1=奇校验;2=偶校验e. 延时:附加字符间延时,缺省值为0f. 最大I/Q位:参与通信的最大I/O点数,S7-200的I/O映像区为128/128,缺省值为128g. 最大AI字数:参与通信的最大AI通道数,可为16或32h. 最大保持寄存器区:参与通信的V存储区字(VW)i. 保持寄存器区起始地址:以&VBx指定(间接寻址方式)j. 初始化完成标志:成功初始化后置1k. 初始化错误代码l. Modbus执行:通信中时置1,无Modbus 通信活动时为0。
m. 错误代码:0=无错误2. 在CPU的V数据区中分配库指令数据区(Library Memory);3. 如有必要,使用主站软件测试。
注意:由子程序参数HoldStart和MaxHold指定的保持寄存器区,是在S7-200 CPU的V 数据存储区中分配,此数据区不能和库指令数据区有任何重叠,否则在运行时会产生错误,不能正常通信。
注意Modbus 中的保持寄存器区按“字”寻址,即MaxHold规定的是VW而不是VB的个数。
在图2的例子中,规定了Modbus 保持寄存器区从VB0 开始(HoldStart =VB0),并且保持寄存器为1000个字(MaxHold=1000),因保持寄存器以字(两个字节)为单位,实际上这个通信缓冲区占用了VB0~VB1999共2000个字节。
因此分配库指令保留数据区时至少要从VB2000开始。
当然保持区不一定要从VB0开始。
注意:你选用的CPU的V存储区大小!CPU型号不同V数据存储区大小不同。
应根据需要选择Modbus保持寄存器区域的大小。
包含Modbus RTU 从站指令库的西门子plc项目编译、下载到CPU中后,在编程计算机(PG/PC)上运行一些Modbus测试软件可以检验S7-200的Modbus RTU通信是否正常,这对查找故障点很有用。
测试软件通过计算机串口(RS-232)和PC/PPI电缆连接CPU。
如果必要,须将PC/PPI 电缆设置在自由口通信方式。
可到一些软件下载网站寻找类似软件,如ModScan32 等。
二、PC机上MScomm控件的串行通信要完成VB与PLC等设备的串行通信要用到MScomm控件,在此有必要对该控件作较详细的说明。
Mscomm是一个非标准控件,需要要手动添加许多项目,其步骤如下。
1)选择菜单的【工程】2)选择【部件】#p#分页标题#e#3)在弹出的对话框中做如图7的选择。
图7 对话框界面4)如图8所示,在部件选项卡就会出现MScomm控件。
图8 MScomm控件5)基本属性三、MODBUS ASCII (16进制码都要转换成ASCII才能发送)Modbus 分为ASCII和RTU两种,ASCII采用的格式和校验相对简单,本文采用ASCII 格式,并仅对使用的功能码进行说明,更多的信息,请参看协议的详细说明。
1)通信格式LRC算法:ADR H+CMD H+DATA H,然后取2的补码。
4.2 VB与PLC通信的实现以下举例说明现场设备与PLC通信的实现。
1)控制要求:控制PLC的起动、停止,并显示运行状态(绿色为运行,红色为停止);能够用交替型按钮控制Y0,Y1,并用指示灯显示Y0,Y1状态(绿色为运行,红色为停止);能够对D256,D512两个寄存器进行数值写入的操作。
2)实现思路:PLC起动停止的标志位为M1072,查DVP协议,知道地址为H0C30,按功能码01操作;同样Y0,Y1的地址分别为H0500,H0501。
写入FF00为ON,0000为OFF,按功能码05操作;D256,D512地址分别为H1100,H1200,按功能码06操作即可。
3)VB接口的设计如图10所示。
图10 监控程序界面用按钮控制PLC的起动停止,Y0、Y1的ON/OFF及D256、D512写完数据的发送;用Shape组件做指示灯,表示PLC的运行状态和Y的状态;用timer 组件不停的读取M1072的状态,以判断PLC的运行情况;用MScomm控件实现PC与PLC的通信。
4)编程实现的代码构成(1) LRC算法校验的实现Public Function LRC(str As String) As Stringc = 0l = Len(str)For c = c + 1 To lc_data = Mid$(str, c, 2)#p#分页标题#e#d_lrc = d_lrc + Val(“&H” + c_data)c = c + 1Next cIf d_lrc 》 &HFF Thend_lrc = d_lrc Mod &H100End Ifh_lrc = Hex(&HFF - d_lrc + 1)If Len(h_lrc)》 2 Thenh_lrc = Mid(h_lrc, Len(h_lrc) - 1, 2)End IfLRC = h_lrcEnd Function(2)运行的开始就判断PLC的状态并设置标志位‘初次运行打开串口,并显示PLC运行状态Private Sub Form_Load()Dim s1 As StringDim s2 As StringDim s22 As StringDim s3 As String#p#分页标题#e#Dim s4 As StringMSComm1.PortOpen = Trues2 = “01010C300001”s22 = LRC(s2)s1 = “:” + s2 + s22 + Chr$(13) + Chr$(10)MSComm1.Output = s1s3 = MSComm1.Inputs4 = Mid$(s3, 6, 8)If s4 = “0C30FF00” Thenplc = 1 ’PLC为运行标志Elseplc = 0 ‘PLC为停止标志End IfEnd Sub(3)下面一段为用指示灯表示PLC的运行状态Private Sub Timer5_Timer()Dim s1 As StringDim s2 As String#p#分页标题#e#Dim s22Dim s3 As StringDim s4 As Strings2 = “01010C300001”s22 = LRC(s2)s1 = “:” + s2 + s22 + Chr$(13) + Chr$(10)MSComm1.Output = s1s3 = MSComm1.Inputs4 = Mid$(s3, 8, 2)If s4 = “31” Thenplc = 1 ’PLC为运行标志Else: If s4 = “30” Then plc = 0 ‘PLC为停止标志End IfIf plc = 1 ThenLabel2.Caption = “PLC正在运行。
.。
.”Shape1.FillColor = RGB(0, 255, 0)’greenElseLabel2.Caption = “PLC已经停止”#p#分页标题#e#Shape1.FillColor = RGB(255, 0, 0)‘redEnd IfEnd Sub(4) PLC的起动与停止’起动PLCPrivate Sub start_Click()Dim strout As StringTimer5.Enabled = Falsestr = “00050C30FF00”‘M1072 为PLC起动停止标志位。
查地址表,M1072为OC30.FF00为置ON,0000为置OFF。
’以上都是固定格式,要牢记。
LRCC = LRC(str)‘计算 str的lrc校验码。
strout = “:” + str + LRCC + Chr$(13) + Chr$(10)’欲传送之数据。
13为D,10为AMSComm1.Output = stroutTimer5.Enabled = TrueEnd Sub‘停止PLC#p#分页标题#e#Private Sub stop_Click()Dim strout As StringTimer5.Enabled = Falsestr = “00050C300000”LRCC = LRC(str)strout = “:” + str + LRCC + Chr$(13) + Chr$(10)MSComm1.Output = stroutTimer5.Enabled = TrueEnd SubY0、Y1的ON/OFF与PLC起动/停止的控制方式相同,指示灯的表示方式也相同。
D256,D512数据写入的操作类似,限于篇幅其它代码就不再列出了四、Modbus RTU格式(以16进制发送和接收)Modbus RTU 从站地址与S7-200的地址对应Modbus地址总是以00001、30004之类的形式出现。
西门子S7-200内部的数据存储区与Modbus的0、1、3、4共4类地址的对应关系如下:表1. Modbus地址对应表其中T为S7-200中的缓冲区起始地址,即HoldStart。
如果已知S7-200中的V存储区地址,推算Modbus地址的公式如下:Modbus地址= 40000 + (T/2+1) ; T为偶数Modbus RTU 从站指令库支持的Modbus 功能码Modbus RTU 从站指令库支持特定的Modbus 功能。