西门子plc200学习笔记 第三课 S7-200作为从站与主站51单片机Modbus RTU通讯

标签:
it教育 |
分类: s7-200学习笔记 |
西门子plc200学习笔记
第三课 S7-200作为从站与主站51单片机Modbus RTU通讯
一、Modbus协议简介
S7-200 CPU上的通信口Port0支持Modbus RTU协议。要实现Modbus RTU通信,需要STEP 7-Micro/WIN32 V3.2以上版本的编程软件,而且须安装STEP 7-Micro/WIN32 V3.2 Instruction Library(指令库)。Modbus RTU功能是通过指令库中预先编好的程序功能块实现的。
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。
协议用于主从查询模式,进行数据通讯。此协议定义了控制器能认识使用的消息结构,结构形式如下所示:
http://s9/mw690/0068KRmqzy7bCVkuwOcd8&690第三课
常用的功能码如下:
代码 |
名称 |
作用 |
01 |
读取线圈状态 |
取得一组逻辑线圈的当前状态(ON/OFF) ,功能 01 返回任意个数输出点(Q)的 ON/OFF 状态。 |
02 |
读取输入状态 |
取得一组开关输入的当前状态(ON/OFF),功能 02 返回任意个数输入点(I)的 ON/OFF 状态。 |
03 |
读取保持寄存器 |
读取单个/多个保持寄存器。功能 03 返回 V 存储区的内容。在 Modbus 协议下保持寄存器都是"字"值,在一次请求中可以读取最多 120 个字的数据。 |
04 |
读取输入寄存器 |
读取单个/多个输入寄存器。功能 04 返回 S7-200 的模拟量数据值。 |
05 |
强置单线圈 |
写单个线圈(离散量输出点)。功能0 5 用于将离散量输出点设置为指定的值。这个点不是被强制的,用户程序可以覆盖 Modbus 通信请求写入的值。 |
06 |
预置单寄存器 |
写单个保持寄存器。功能 06 写一个值到 S7-200 的 V 存储区的保持寄存器中。 |
07 |
读取异常状态 |
取得8个内部线圈的通断状态 |
15 |
强置多线圈 |
写多个线圈(离散量输出点)。功能 15 把多个离散量输出点的值写到 S7-200 的输出映像寄存器(Q 区)。输出点的地址必须以字节边界起始(如 Q0.0 或 Q2.0),并且输出点的数目必须是 8 的整数倍。这是此 Modbus RTU 从站指令库的限制。些点不是被强制的,用户程序可以覆盖 Modbus 通信请求写入的值。 |
16 |
预置多寄存器 |
写多个保持寄存器。功能 16 写多个值到 S7-200 的 V 存储区的保持寄存器中。在一次请求中可以写最多 120 个字的数据。 |
17 |
报告从机标识 |
可使主机判断编址从机的类型及该从机运行指示灯的状态 |
举例说明:主机要从17号从机读3个采集到的基本数据U1、U2、U3,U1的地址为0000H, U2的地址为0001H,U3的地址为0002H。主机发送的命令格式是:110300000003075B
其中11是16进制数表示的地址是17号从站,03表示查询命令,0000是查询的寄存器起始地址,0003是要查询的寄存器末地址,075B是CRC校验值。
当主机的信息帧到达终端设备时,从机读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据帧返回给主机。返回的响应数据中包含了以下内容:终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和校验码(Check)。如上例中主机发送110300000003075B,从机响应格式是:11030603E803E703E9FD9C,其中11是地址(16进制数),03是功能码,06是返回的字节数,03E803E703E9(U1=03E8H,U2=03E7H,U3=03E9H)是返回的6个字节数据,FD9C是CRC校验码。
另一个例子是请求17号从机0040H的值为2717。主机发送命令:110600400A9D4D87
其中11是地址,06是功能码(预设单寄存器),0040是寄存器地址,0A9D是数据,等于十进制的2717,4D87是CRC校验码。从机对于预置单寄存器请求的正常响应是在寄存器值改变以后将接收到的数据传送回去。从机返回的数据是:110600400A9D4D87。
例如单片机作为主机要读s7-200的V存储区数据,需要发送0C0300320004E4DB读取保持寄存器(功能码03)此例是要在12号从机的存储区起始地址是0032h地址读4个数据,返回8个字节。0C03080092009200000000A4
二、51单片机作为主机读写S7-200数据的程序
在主程序中调用下面子程序即可。
51单片机读PLC输入状态I0.0的子程序如下:
FFJ02:
FJ4:
FJ1:
FJ0:
51单片机读V存储区数据的子程序如下:
FFJ03:
FJ7:
51单片机读S7-200输出状态Q0.0的子程序如下:
FFJ033:
FJ9:
AJMP FJ1
PDOK1:
FXL2:
SB1:
SB2:
一、S7-200程序
1、
下载Modbus协议库,打开目录,点击http://s14/bmiddle/0068KRmqzy7bCVpo8C90d&690第三课
http://s11/mw690/0068KRmqzy7bCVryf0Kea&690第三课
安装成功后左侧浏览条的“库”中如下图:
http://s14/mw690/0068KRmqzy7bCVrMmcZ8d&690第三课
2、S7-200程序
S7-200程序如下图,首先调用MBUS_INIT模块,初始化有关参数,如波特率,奇偶校验等要与主机一致。每一项的含义如下所示:
http://s13/mw690/0068KRmqzy7bCVtAmNSfc&690第三课
Mode:
Address:
Baud:
Parity:
Delay:
MaxIQ:
MaxAI:
MaxHold:
HoldStart:
Done:
Error:
在本例子中,设置从站地址为3
Port0 通讯波特率为9600
无校验
可以使用的S7-200最大数字量输入输出点数为128
可以使用的S7-200最大模拟量输入寄存器字数为32
可以使用的V区寄存器地址字数为100, 起始地址为VB1000
SM0.0是s7-200的特殊寄存器,RUN监控,PLC在运行状态时,SM0.0总为ON。
本程序初始化完成后,还调用了MBUS_SLAVE子程序,它属于协议库的一部分。此程序是加密的。如下图左面有一个锁,在“查看”选属性后会弹出密码保护如下图。
http://s2/mw690/0068KRmqzy7bCVyssAp61&690第三课
http://s6/mw690/0068KRmqzy7bCVyFD4955&690第三课
http://s12/mw690/0068KRmqzy7bCVyYeUP1b&690第三课
注意:本例子中,Modbus RTU 从站指令使用的库存储为VB0---VB779,这段寄存器地址不能再被程序中的任何指令使用,包括MBUS_INIT 和 MBUS_SLAVE 指令在内。