新浪博客

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

2017-06-05 10:17阅读:
西门子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 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

协议用于主从查询模式,进行数据通讯。此协议定义了控制器能认识使用的消息结构,结构形式如下所示:
西门子plc200学习笔记 <wbr>第三课 <wbr>S7-200作为从站与主站51单片机Modbus <wbr>RTU通讯

常用的功能码如下:
代码
名称
作用
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个采集到的基本数据U1U2U3U1的地址为0000H, U2的地址为0001HU3的地址为0002H。主机发送的命令格式是:110300000003075B
其中1116进制数表示的地址是17号从站,03表示查询命令,0000是查询的寄存器起始地址,0003是要查询的寄存器末地址,075BCRC校验值。
当主机的信息帧到达终端设备时,从机读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据帧返回给主机。返回的响应数据中包含了以下内容:终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和校验码(Check)。如上例中主机发送110300000003075B,从机响应格式是:11030603E803E703E9FD9C,其中11是地址(16进制数),03是功能码,06是返回的字节数,03E803E703E9(U1=03E8H,U2=03E7H,U3=03E9H)是返回的6个字节数据,FD9CCRC校验码。
另一个例子是请求17号从机0040H的值为2717。主机发送命令:110600400A9D4D87
其中11是地址,06是功能码(预设单寄存器),0040是寄存器地址,0A9D是数据,等于十进制的27174D87CRC校验码。从机对于预置单寄存器请求的正常响应是在寄存器值改变以后将接收到的数据传送回去。从机返回的数据是:110600400A9D4D87
例如单片机作为主机要读s7-200V存储区数据,需要发送0C0300320004E4DB读取保持寄存器(功能码03)此例是要在12号从机的存储区起始地址是0032h地址读4个数据,返回8个字节。0C03080092009200000000A46F,若要读PLC输入状态(功能码02),发送0C0200000001返回0C02010162E4,若要读PLC的输出状态(功能码01),发送0C0100000001返回0C01010192E4

二、51单片机作为主机读写S7-200数据的程序
在主程序中调用下面子程序即可。
51单片机读PLC输入状态I0.0的子程序如下:
FFJ02: MOV B,#10H ;PLC输入状态I0.0
FJ4: MOV 2DH,#0CH ;地址;;;;;;;;;;;;
MOV 2EH,#02H ;功能码02h
MOV 2FH,#00H ;起始开关量地址
MOV 30H,#00H ;起始寄存器地址
MOV 31H,#00H ;寄存器个数,最多25
MOV 32H,#01H
ORL AUX,#80H ;p1.6p1.7当串口
CLR EA
SETB P3.7
MOV CRCCD,#06H
LCALL CRC
MOV R2,#08H
MOV R0,#2DH;2CH
FJ1: MOV SBUF,@R0
JNB TI,$
CLR TI
INC R0
DJNZ R2,FJ1
LCALL PDOK1 ;读返回的DI,DO
JNZ FJ0 ;如果没有检测到OK,重复发
CALL DELAY
DJNZ B,FJ4
FJ0: SETB FLAG_1
SETB EA
RET
51单片机读V存储区数据的子程序如下:

FFJ03: MOV B,#10H ;'V存储区数据
FJ7: MOV 2DH,#0CH ;地址
MOV 2EH,#03H ;

我的更多文章

下载客户端阅读体验更佳

APP专享