美化西门子标准报文1通信规约 10页
- 格式:pptx
- 大小:1.10 MB
- 文档页数:10
第1章绪论❖ 1.1 PLC控制网络的基本特点和通信功能❖ 1.2 数据通信❖ 1.3 工业局域网概述❖ 1.4 S7-300/400 PLC的通信网络概述1.1 PLC控制网络的基本特点和通信功能❖ 1.PLC控制网络的基本特点1)传输介质和链接组件标准化2)传输高可靠性3)良好的系统扩展性4)良好的覆盖面积5)较高的数据传输速率❖ 2.PLC的通信功能1)远程控制2)PLC局域网络系统3)PLC与上位机进行点对点通信1.2 数据通信❖具有一定的编码、格式和位长要求的数字信号成为数据信息。
❖数据通信是将数据信息通过适当的传送线路从一台机器传送到另一台机器。
❖数据通信系统的任务是把地理位置不同的计算机和PLC及其他数字设备连接起来,高效率地完成数据的传送、信息交换和通信处理三项任务。
❖数据通信系统组成传送设备传送控制设备传送协议通信软件1.2.1 数据传输方式的分类❖ 1.串行传输与并行传输1)串行传输数据在一个信道上按位顺序传输的方式。
特点:一或两根传输线远距离传输成本低速度慢2)并行传输数据在多个信道同时传输的方式。
特点:传输速度快传输线多,成本高2.频带传输与基带传输1)频带传输把信号调制到某一频带上的传输方式。
三种调制方式:调幅调频调相2)基带传输数据传输系统对信号不做任何调制,直接传输数据的传输方式。
PLC网络大多采用基带传输。
基带传输方式使整个频带范围都用来传输某一数字信号,常用于半双工通信。
频带传输时,在同一传输线路上可用频带分割的方法将频带划分为几个信道,同时传输多路信号,常用于全双工通信。
3.异步传输和同步传输1)异步传输异步传输也称为起止式传输,它是利用起止法来达到收发同步的。
在异步传输中,被传输的数据编码为一串脉冲,每一个传输的字符都有一个附加的起始位和多个停止位。
字节传输由起始位“0”开始,然后是被编码的字节。
通常低位在前,高位在后,接下来是校验位(可省略),最后是停止位“1”(可以是1位、1.5位或2位,用以表示字符的结束)。
一、DL/T667-1999(IEC60870-5-103)通信规约1. 通信接口1.1 接口标准:RS232、RS485、光纤。
1.2 通信格式:异步,1位起始位,8位数据位,1位偶校验位,1位停止位。
字符和字节传输由低至高。
线路空闲状态为1。
1.3 通信速率:可变。
默认96001.4 通信方式:主从一对多,Polling方式。
2. 报文格式60870-5-103通信规约有固定帧长报文和可变帧长报文两种报文格式,前者主要用于传送“召唤、命令、确认、应答”等信息,后者主要用于传送“命令”和“数据”等信息。
2.1 固定帧长报文10 H 启动字符CODE 控制域ADDR 地址域C S 代码和16 H 结束字符注:代码和=控制域+地址域(不考虑溢出位,即256模和)2.268 H ————启动字符1(1byte)Length ————长度(1byte)Length ————长度(重复)(1byte)68 H ————启动字符2(重复)(1byte)CODE ————控制域(1byte)ADDR ————地址域(1byte)ASDU ————链路用户数据[(length-2)byte]C S————代码和(1byte)16 H ————结束字符(1byte)注:(1)代码和=控制域+地址域+ ASDU代码和(不考虑溢出位,即256模和)(2)ASDU为“链路用户数据”包,具体格式将在下文介绍(3)Length=ASDU字节数+22.3 控制域控制域分“主从”和“从主”两种情况。
(1)“主从”报文的控制域D7 D6 D5 D4 D3 D2 D1 D0备用PRM FCB FCV 功能码0 11(A)PRM(启动报文位)表明信息传输方向,PRM=1由主站至子站;PRM=0由子站至主站。
(B)FCB(桢记数位)。
FCB = 0 / 1——主站每向从站发送新一轮的“发送/确认”或“请求/响应”传输服务时,将FCB取反。
TPC和西门子SMART200 PLC通讯说明S7-200 SMART CPU 模块本体集成1个以太网接口和一个RS485接口,通过扩展CM01信号版,其通讯端口数量最多可增到3个。
串口支持下列协议:PPI、ModbusRTU、USS、自由口通讯通讯连接方式:<1>采用标准串口型号的西门子PC/PPI电缆。
<2>采用RS232/485转换器连接,RS485的A正B负与PLC编程口3正8负连接。
<3>TPC触摸屏的RS485接口的A正B负与PLC编程口3正8负连接。
注意:1.只支持串口型号的PPI电缆,不支持USB型号的PPI电缆,使用时请注意。
2.TPC触摸屏的DB9针的口里面7、8脚为RS485的正和负。
1 PPI协议通讯SMART200通讯参数设置:SMART200 PLC可以通过西门子STEP 7-MicroWIN SMART配置波特率和PLC地址。
当为SMART200修改参数后,需要将改动参数的系统块下载至SMART200。
每台SMART200 CPU的默认波特率为9.6 kbps(即: 9600 bps),默认PLC地址为2(数据位,停止位,校验位固定为8位、1位,偶校验)。
通讯参数设置方法:1、将电脑本地网卡的IP 设置和PLC的IP在同一个网段内,PLC默认IP为192.168.2.12、通过网线连接好电脑和PLC连接好,运行西门子STEP 7-MicroWIN SMART软件,双击通讯,更新可访问的设备,找到所连接PLC的IP,选择后点击确认。
3、双击系统块,打开通讯部分,设置RS485端口的通讯参数,设置地址和波特率,默认波特率为9.6 kbps(即: 9600 bps),默认PLC地址为2。
4、MCGS添加西门子PPI驱动,通用串口父设备使用默认参数设置,如下图“西门子_S7200PPI”子设备参数设置如下:设备地址:PLC设备地址,可设定范围1-31,默认值为2。
Modbus_RTU通讯规约(本协议采用主从问答方式)一、Modbus通讯协议概述Modbus通讯规约允许TDS系列仪表/变送器与施耐德、西门子、AB、GE等多个国际著名品牌的可编程顺序控制器(PLC)、RTU、SCADA系统、DCS或与第三方具有Modbus兼容的监控系统之间进行信息交换和数据传送。
TDS系列仪表/变送器只要简单地增加一套基于计算机(或工控机)的监控软件(如:组态王、Intouch、iFIX、synall等)就可以构成一套工况监控系统。
1、广泛的系统集成TDS系列仪表/变送器提供了标准的RS-485/422通讯接口及ModBus通讯协议,这个通讯协议已广泛被国内外工控行业作为系统集成的标准。
2、通讯数据的类型及格式●信息传输为异步方式,并以字节为单位。
主站和从站之间传递的通讯信息为1:10位格式:(1位起始位,8位数据位,1位停止位,无奇偶校验)2:11位格式:(1位起始位,8位数据位,2位停止位,无奇偶校验)3:11位格式:(1位起始位,8位数据位,1位停止位,1位奇校验)4:11位格式:(1位起始位,8位数据位,1位停止位,1位偶校验)仪表出厂按第2种方式,11位格式:(1位起始位,8位数据位,2位停止位,无奇偶校验),设置方法参看详细的使用说明书。
仪表无此项设置参数为第2种方式。
●通讯数据(信息帧)格式输波特率计算(9600bps约为5ms),信息帧中表示为起始结构(T1–T2–T3–T4),T1、T2、T3、T4分别代表一个字节的静止时间。
当最后一个字节传输完,数据总线静止时间(即无数据时间)还需大于3.5个字节后,才可以开始发送新的数据,信息帧中表示为停止结构(T1–T2–T3–T4)。
一条完整的信息帧必须是连续的信息流,字节间的间隔时间小于1.5个字节。
TDS系列仪表/变送器收到完整的信息帧后延时250ms左右将数据连续送出,当收到本机地址码、正确的功能码后,但无法接收全后面的完整数据信息帧则在2秒左右后回复初始接收状态。
IEC104规约报文说明(104报文解释的比较好的文本)IEC104规约调试小结调试广西中调IEC-104规约时对报文作了如下的分析,不对地方请指正。
一、四遥信息体基地址范围“可设置104调度规约”有1997年和2002年两个版本,在流程上没有什么变化,02版只是在97版上扩展了遥测、遥信等信息体基体址,区别如下:三、以公共地址字节数=2,传输原因字节数=2,信息体地址字节数=3为例对一些基本的报文分析第一步:首次握手(U帧)发送→激活传输启动:68(启动符)04(长度)07(控制域)00 00 00接收→确认激活传输启动:68(启动符)04(长度)0B(控制域)00 00 00第二步:总召唤(I帧)召唤YC、YX(可变长I帧)初始化后定时发送总召唤,每次总召唤的间隔时间一般设为15分钟召唤一次,不同的主站系统设置不同。
发送→总召唤:68(启动符)0E(长度)00 00(发送序号)00 00(接收序号)64(类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址即RTU地址)00 00 00(信息体地址)14(区分是总召唤还是分组召唤,02年修改后的规约中没有分组召唤)接收→S帧:注意:记录接收到的长帧,双方可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收1帧I帧就应答1帧S帧。
68 04 01 00 02 00接收→总召唤确认(发送帧的镜像,除传送原因不同):68(启动符)0E(长度)00 00(发送序号)00 00(接收序号)64(类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址即RTU地址)00 00 00(信息体地址)14(同上)发送→S帧:注意:记录接收到的长帧,双方可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收1帧I帧就应答1帧S帧。
68 04 01 00 02 00接收→YX帧(以类型标识1为例):68(启动符)1A(长度)02 00(发送序号)02 00(接收序号)01(类型标示,单点遥信)04(可变结构限定词,有4个遥信上送)14 00(传输原因,响应总召唤)01 00(公共地址即RTU地址)03 00 00(信息体地址,第3号遥信)00(遥信分)发送→S帧:68 04 01 00 04 00接收→YX帧(以类型标识3为例):68(启动符)1E(长度)04 00(发送序号)02 00(接收序号)03(类型标示,双点遥信)05(可变结构限定词,有5个遥信上送)14 00(传输原因,响应总召唤)01 00(公共地址)01 00 00(信息体地址,第1号遥信)02(遥信合)06 00 00(信息体地址,第6号遥信)02(遥信合)0A 00 00(信息体地址,第10号遥信)01(遥信分)0B 00 00(信息体地址,第11号遥信)02(遥信合)0C 00 00(信息体地址,第12号遥信)01(遥信分)发送→S帧:68 04 01 00 06 00接收→YC帧(以类型标识9为例):68(启动符)13(长度)06 00(发送序号)02 00(接收序号)09(类型标示,带品质描述的遥测)82(可变结构限定词,有2个连续遥测上送)14 00(传输原因,响应总召唤)01 00(公共地址)01 07 00(信息体地址,从0X0701开始第0号遥测)A1 10(遥测值10A1)00(品质描述)89 15(遥测值1589)00(品质描述)发送→S帧:68 04 01 00 08 00接收→结束总召唤帧:68(启动符)0E(长度)08 00(发送序号)02 00(接收序号)64(类型标示)01(可变结构限定词)0A 00(传输原因)01 00(公共地址)00 00 00(信息体地址)14(区分是总召唤还是分组召唤,02年修改后的规约中没有分组召唤)发送→S帧:68 04 01 00 0A 00第二步:发送对时报文(通过设置RTU参数表中的”对间间隔”,单位是分钟,一般是20分钟)发送→对时命令:68(启动符)14(长度)02 00(发送序号)0A 00(接收序号)67(类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址)00 00 00(信息体地址)01(毫秒低位)02(毫秒高位)03(分钟)04(时)81(日与星期)09(月)05(年)接收→对时确认:68(启动符)14(长度)0C 00(发送序号)02 00(接收序号)67(类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址)00 00 00(信息体地址)**(毫秒低位)**(毫秒高位)**(分钟)04(时)81(日与星期)09(月)05(年)发送→S帧:68 04 01 00 0E 00第三步:电度总召唤(如果没有电度此步骤可以省略且可以在对时之前以送.通过设置参数中”全数据扫描间隔”,单位是分钟一般是15分钟召唤一交,如果不需要召唤电度一定要将参数中的电度个数设为0)发送→召唤电度:68(启动符)0E(长度)04 00(发送序号)0E 00(接收序号)65(类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址)00 00 00(信息体地址)45(QCC)接收→召唤确认(发送帧的镜像,除传送原因不同) :68(启动符)0E(长度)10 00(发送序号)06 00(接收序号)65(类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址)00 00 00(信息体地址)45(QCC)发送→S帧:68 04 01 00 12 00接收→电度数据:68(启动符)1A(长度)12 00(发送序号)06 00(接收序号)0F (类型标示)02(可变结构限定词,有两个电度量上送)05 00(传输原因)01 00(公共地址)01 0C 00(信息体地址,从0X0C01开始第0号电度)00 00 00 00(电度值)00(描述信息)02 0C 00(信息体地址,从0X0C01开始第1号电度)00 00 00 00(电度值)01(描述信息)发送→S帧:68 04 01 00 14 00接收→结束总召唤帧:68(启动符)0E(长度)14 00(发送序号)06 00(接收序号)65(类型标示)01(可变结构限定词)0A 00(传输原因)01 00(公共地址)00 00 00(信息体地址)45(QCC)发送→S帧:68 04 01 00 16 00第四步:如果RTU有变化数据主动上送主动上送变位遥信,类型标识为1或3接收→变位遥信:68(启动符)0E(长度)16 00(发送序号)06 00(接收序号)01(类型标示,单点遥信)01(可变结构限定词,有1个变位遥信上送)03 00(传输原因,表突发事件)01 00(公共地址即RTU地址)03 00 00(信息体地址,第3号遥信)00(遥信分)发送→S帧:68 04 01 00 18 00接收→变位遥信:68(启动符)0E(长度)18 00(发送序号)06 00(接收序号)03(类型标示,双点遥信)01(可变结构限定词,有1个变位遥信上送)03 00(传输原因,表突发事件)01 00(公共地址即RTU地址)06 00 00(信息体地址,第6号遥信)01(遥信分)发送→S帧:68 04 01 00 1a 00主动上送SOE,类型标识为0x1e或0x1f接收→SOE :68(启动符)15(长度)1a 00(发送序号)06 00(接收序号)1e (类型标示,单点遥信)01(可变结构限定词,有1个SOE)03 00(传输原因,表突发事件)01 00(公共地址即RTU地址)08 00 00(信息体地址,第8号遥信)00(遥信分)ad(毫秒低位)39(毫秒高位)1c(分钟)10(时)7a(日与星期)0b(月)05(年)发送→S帧:68 04 01 00 1c 00接收→SOE :68(启动符)15(长度)1c 00(发送序号)06 00(接收序号)1f (类型标示,双点遥信)01(可变结构限定词,有1个SOE)03 00(传输原因,表突发事件)01 00(公共地址即RTU地址)0a 00 00(信息体地址,第10遥信)01(遥信分)2f(毫秒低位)40(毫秒高位)1c(分钟)10(时)7a(日与星期)0b(月)05(年)第四步:如果主站超过一定时间没有下发报文或RTU也没有上送任何报文则双方都可以按频率发送U帧,测试帧发送→U帧:68 04 43 00 00 00接收→应答:68 04 83 00 00 00第五步:遥控发送→遥控预置:68(启动符)0e(长度)20 00(发送序号)06 00(接收序号)2e (类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)82(控合)接收→遥控返校:68(启动符)0e(长度)0e 00(发送序号)06 00(接收序号)2e (类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)82(控合)发送→遥控执行:68(启动符)0e(长度)04 00(发送序号)18 00(接收序号)2e (类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)02(控合)接收→执行确认:68(启动符)0e(长度)12 00(发送序号)08 00(接收序号)2e (类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)02(控合)发送→遥控撤消:68(启动符)0e(长度)04 00(发送序号)18 00(接收序号)2e (类型标示)01(可变结构限定词)08 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)02(控合)接收→撤消确认:68(启动符)0e(长度)12 00(发送序号)08 00(接收序号)2e (类型标示)01(可变结构限定词)09 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)02(控合)补充说明:1、报文中的长度指的是除启动字符与长度字节的所有字节。
101通信规约第一部分基本定义一、适用范围1、网络拓扑结构本规约适用的网络拓扑结构为点对点、多点对点、多点共线、多点环形、多点星形等,通道可以是全双工或半双工的情况。
2、传输方式传输方式分为非平衡方式和平衡方式传输两种。
非平衡方式传输:只有主站启动各种链路传输服务,子站只有当主站请求时才传输。
这种传输方式对于所有网络结构都可适用。
但是在点对点和多点对点的网络结构中,非平衡方式传输没有充分发挥这种网络的内在潜力。
平衡方式传输:主站和子站可以同时启动链路传输服务,所以必须有一对全双工的通道。
这里规定对于点对点和多点对点的网络结构采用平衡方式传输,对于多点共线、多点环形和多点星形的网络结构采用非平衡方式传输。
二、帧格式本规约采用的帧格式为FT1.2异步式字节传输帧格式1、FT1.2可变帧长帧格式其具体格式如下传输规定:(1)线路空闲状态为1(2)每个字符有1位启动位(0),8位数据位,1位偶校验位,1位停止位(1)(3)每个字符间无需线路空闲间隔。
(4)两帧之间的线路空闲间隔最少为33位(5)帧长度L包括控制域、地址域、用户数据的字节总数,L最大为250(6)帧校验和为控制域、地址域、用户数据中所有字节的算术和(不考虑溢出)(7)接收校验●由串行接口芯片检查每个字符的启动位、停止位、偶校验位●校验两个启动字符应一致、两个L值应一致,接收字符数L+6、帧校验和、结束字符无差错则数据有效。
●在校验中,若检出一个差错,则舍弃此帧数据。
2、FT1.2固定帧长帧格式具体格式如下:传输规定:(1)线路空闲状态为1(2)每个字符有1位启动位(0),8位数据位,1位偶校验位,1位停止位(1)(3)每个字符间无需线路空闲间隔。
(4)两帧之间的线路空闲间隔最少为33位(5)无帧长度L(6)帧校验和为控制域、地址域中所有字节的算术和(不考虑溢出)(7)接收校验●由串行接口芯片检查每个字符的启动位、停止位、偶校验位●检查启动字符、结束字符以确定此帧长度是否正确●检查校验和●在校验中,若检出一个差错,则舍弃此帧数据。
西门⼦S7报⽂解析1.报⽂的基本格式1.1 第1和第2个字节是:固定报⽂头03 00,这⾥我们就⽤到三种报⽂: a.初始化 b. 读 c.写,都是这种格式;1.2 第3和第4个字节是:整个报⽂的长度;其它部分就是各种报⽂的个性化处理了;下⾯分析⼤量报⽂的案例进⾏规律分析,为了便于对照,每种都⽤1200 和300 两种对照demo显⽰:2.初始化报⽂初始化报⽂分两个交互:2.1 交互⼀西门⼦1200:PC发出报⽂ ( [A18]=0x01 =CPUSlot)03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 01(cpuslot) C0 01 09PLC回复报⽂( B[10]=0x06 可能是西门⼦的⼩型号 B[22]=0x01=CPUSlot)03 00 00 16 11 D0 00 01 00 06 00 C0 01 09 C1 02 01 00 C2 02 01 01 (cpuslot)西门⼦300:PC发出报⽂ ( A[18]=0x02 =CPUSlot)03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 02(cpuslot) C0 01 09PLC回复报⽂ (B[10]=0x04 可能是西门⼦的⼩型号 B[22]=0x0=CPUSlot)03 00 00 16 11 D0 00 01 00 04 00 C0 01 09 C1 02 01 00 C2 02 01 02opc 对 1200 和 300 不⽤配置的不同点,就⼀个地⽅:前者 CPUSlot = 1 ,后者CPUSlot = 2;所以可以摸索规律是:a.pc发起第⼀个初始化报⽂的时候,第18个字节标识了CPUSlot ;b.plc回复报⽂和读取报⽂长度⼀样都是22个字节长度;c.plc回复报⽂的最后⼀个字节也是CPUSlot ,这个可以⽤来校验;d. plc回复的第10个字节⼀个是06,⼀个是04,这个好像是⼩型号的区别;细节摸索下来:1200该字节是06,314是04,315是03;咱写程序的时候,就不要考虑这个来校验了;2.2交互⼆PC发出报⽂03 00 00 19 02 F0 80 32 01 00 00 FF FF 00 08 00 00 F0 00 00 01 00 01 07 80PLC回复报⽂03 00 00 1B 02 F0 80 32 03 00 00 FF FF 00 08 00 00 00 00 F0 00 00 01 00 01 00 F0第⼆个初始化报⽂交互,通过1200 和314,315的对⽐,发现居然完全没有任何区别;所以我们可以把这个交互完全固话;到此,整个初始化处理就算结束了,正常在设计架构的时候,可以这么实现:在ClentSocket的onConnect(即正常连接上)的瞬间,pc给plc发起第⼀个初始请求,得到回复后(为了简单,就仅仅判断长度为22即可);⽴刻发起第⼆个固定的初始话请求,得到长度为24的报⽂后,就通过⼀个布尔变量通知整个系统可以正常读写;3.读操作读demo1:西门⼦1200: 读取DB10, count=17 ,offset=19PC发出报⽂(A[3]~A[4]=0x001F=31=读取报⽂总长度, A[12]~A[13]=0x001C=序列号,A[24]~A[25]=0x0011=17=读取请求count;A[26]~A[27]=0x000A=10=DB10, A[28]=0x84=读取的数据类型为DB块,A[29]~A[31]=0x000098=152=19*8=读取偏移量offset(bit为单位) ) 03 00 00 1F 02 F0 80 32 01 00 00 00 1C 00 0E 00 00 04 01 12 0A 10 02 00 11 00 0A 84 00 00 98PLC回复报⽂:(B[3]~B[4]=0x002A=42=回复报⽂总长度, B[12]~B[13]=0x001C=序列号,B[16]~B[17]=0x0015=21=读取请求count(17)+4B[24]~B[25]=0x0088=17*8=请求数据长度(bit为单位), B[26]~最后=数据值)03 00 00 2A 02 F0 80 32 03 00 00 00 1C 00 02 00 15 00 00 04 01 FF 04 00 88 13 14 15 16 17 00 00 00 00 00 00 00 00 00 00 00 00读demo2:西门⼦1200: 读取DB11, count=17 ,offset=19PC发出报⽂:(A[3]~A[4]=0x001F=31=读取报⽂总长度, A[12]~A[13]=0x008E=序列号,A[24]~A[25]=0x0011=17=读取请求count;A[26]~A[27]=0x000B=11=DB11, A[28]=0x84=读取的数据类型为DB块,A[29]~A[31]=0x000098=152=19*8=读取偏移量offset(bit为单位) ) 03 00 00 1F 02 F0 80 32 01 00 00 00 8E 00 0E 00 00 04 01 12 0A 10 02 00 11 00 0B 84 00 00 98PLC回复报⽂:(B[3]~B[4]=0x002A=42=回复报⽂总长度, B[12]~B[13]=0x001C=序列号,B[16]~B[17]=0x0015=21=读取请求count(17)+4B[24]~B[25]=0x0088=17*8=请求数据长度(bit为单位), B[26]~B[42]=数据值)03 00 00 2A 02 F0 80 32 03 00 00 00 8E 00 02 00 15 00 00 04 01 FF 04 00 88 13 14 15 16 17 18 00 00 00 00 00 00 00 00 21 22 23读demo3:西门⼦1200:读取DB11, count=16 ,offset=18PC发出报⽂:(A[3]~A[4]=0x001F=31=读取报⽂总长度, A[12]~A[13]=0x0013=序列号,A[24]~A[25]=0x0010=16=读取请求count;A[26]~A[27]=0x000B=11=DB11, A[28]=0x84=读取的数据类型为DB块,A[29]~A[31]=0x000090=146=18*8=读取偏移量offset(bit为单位) ) 03 00 00 1F 02 F0 80 32 01 00 00 00 13 00 0E 00 00 04 01 12 0A 10 02 00 10 00 0B 84 00 00 90PLC回复报⽂:(B[3]~B[4]=0x0029=41=回复报⽂总长度, B[12]~B[13]=0x0013=序列号,B[16]~B[17]=0x0014=20=读取请求count(16)+4B[24]~B[25]=0x0080=16*8=请求数据长度(bit为单位), B[26]~B[41]=数据值)03 00 00 29 02 F0 80 32 03 00 00 00 13 00 02 00 14 00 00 04 01 FF 04 00 80 00 13 14 15 16 17 18 00 00 00 00 00 00 00 00 21读demo4:西门⼦300 (314) 读取D50, count=20 ,offset=4000PC发出报⽂:(A[3]~A[4]=0x001F=31=读取报⽂总长度, A[12]~A[13]=0x0028=序列号,A[24]~A[25]=0x0014=20=读取请求count;A[26]~A[27]=0x0032=50=DB50, A[28]=0x84=读取的数据类型为DB块,A[29]~A[31]=0x007D00=32000=4000*8=读取偏移量offset(bit为单位) )03 00 00 1F02 F0 80 32 01 00 00 00 28 00 0E 00 00 04 01 12 0A 10 02 00 14 00 32 8400 7D 00PLC回复报⽂:(B[3]~B[4]=0x002D=45=回复报⽂总长度, B[12]~B[13]=0x0028=序列号,B[16]~B[17]=0x0018=24=读取请求count(20)+4B[24]~B[25]=0x00A0=20*8=请求数据长度(bit为单位), B[26]~B[45]=数据值)03 00 00 2D02 F0 80 32 03 00 00 00 28 00 02 00 18 00 00 04 01 FF 04 00 A0 00 04 0E AB 00 00 00 00 00 00 03 00 00 00 00 00 00 00 0000读demo5:西门⼦300 (315) 读取D10, count=100 ,offset=2PC发出报⽂:(A[3]~A[4]=0x001F=31=读取报⽂总长度, A[12]~A[13]=0x0003=序列号,A[24]~A[25]=0x0064=100=读取请求count;A[26]~A[27]=0x000A=10=DB10, A[28]=0x84=读取的数据类型为DB块,A[29]~A[31]=0x000010=16=2*8=读取偏移量offset(bit为单位) )03 00 00 1F 02 F0 80 32 01 00 00 00 03 00 0E 00 00 04 01 12 0A 10 02 00 64 00 0A 84 00 00 10PLC回复报⽂:(B[3]~B[4]=0x007D=125=回复报⽂总长度, B[12]~B[13]=0x0003=序列号,B[16]~B[17]=0x0068=104=读取请求count(100)+4B[24]~B[25]=0x0320=100*8=请求数据长度(bit为单位), B[26]~B[125]=数据值)03 00 00 7D 02 F0 80 32 03 00 00 00 03 00 02 00 68 00 00 04 01 FF 04 03 20 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00读demo6:西门⼦1200 读取X输⼊(input)两个byte:PC发出报⽂:(A[3]~A[4]=0x001F=31=读取报⽂总长度, A[12]~A[13]=0x0002=序列号,A[24]~A[25]=0x0002=2=读取请求count;A[26]~A[27]=0x000A=10=DB10[其实这⾥写什么都可以,因为input不属于DB块],A[28]=0x81=读取的数据类型为Input,A[29]~A[31]=0x000000=0=0*8=读取偏移量offset(bit为单位) )03 00 00 1F 02 F0 80 32 01 00 00 00 02 00 0E 00 00 04 01 12 0A 10 02 00 02 00 0A 81 00 00 00PLC回复报⽂:(B[3]~B[4]=0x001B=27=回复报⽂总长度, B[12]~B[13]=0x0002=序列号,B[16]~B[17]=0x0068=104=读取请求count(100)+4B[24]~B[25]=0x0320=100*8=请求数据长度(bit为单位), B[26]~B[27]=数据值)03 00 00 1B 02 F0 80 32 03 00 00 00 02 00 02 00 06 00 00 04 01 FF 04 00 10 08 00读demo7:西门⼦1200 读取Y输出(output)两个byte:PC发出报⽂:(A[3]~A[4]=0x001F=31=读取报⽂总长度, A[12]~A[13]=0x0001=序列号,A[24]~A[25]=0x0002=2=读取请求count;A[26]~A[27]=0x000A=10=DB10[其实这⾥写什么都可以,因为input不属于DB块],A[28]=0x82=读取的数据类型为Output,A[29]~A[31]=0x000000=0=0*8=读取偏移量offset(bit为单位) )03 00 00 1F 02 F0 80 32 01 00 00 00 01 00 0E 00 00 04 01 12 0A 10 02 00 02 00 0A 82 00 00 00PLC回复报⽂:(B[3]~B[4]=0x001B=27=回复报⽂总长度, B[12]~B[13]=0x0002=序列号,B[16]~B[17]=0x0068=104=读取请求count(100)+4B[24]~B[25]=0x0320=100*8=请求数据长度(bit为单位), B[26]~B[27]=数据值)03 00 00 1B 02 F0 80 32 03 00 00 00 01 00 02 00 06 00 00 04 01 FF 04 00 10 05 00读demo8:西门⼦1200 读取flag两个byte:03 00 00 1F 02 F0 80 32 01 00 00 05 65 00 0E 00 00 04 01 12 0A 10 02 00 02 00 09 83 00 00 00PLC回复报⽂:(B[3]~B[4]=0x001B=27=回复报⽂总长度, B[12]~B[13]=0x0565=序列号,B[16]~B[17]=0x0006=6=读取请求count(2)+4B[24]~B[25]=0x0010=2*8=请求数据长度(bit为单位), B[26]~B[27]=数据值)03 00 00 1B 02 F0 80 32 03 00 00 05 65 00 02 00 06 00 00 04 01 FF 04 00 10 FF 17根据以上8个报⽂的demo,摸索出⼤致规律如下(未必完全正确,但是应付项⽬可以了);A[1]~A[2]: 03 00 固定报⽂头;A[3]~A[4]: 00 1F 整个读取请求长度为0x1F= 31 ;A[5]~A[11]: 02 F0 80 32 01 00 00 固定6个字节;A[12]~A[13]: 两个字节,标识序列号,回复报⽂相同位置和这个完全⼀样;范围是0~65535;A[14]~A[23]:00 0E 00 00 04 01 12 0A 10 02 固定10个字节A[24]~A[25]:两个字节,访问数据的个数,以byte为单位;A[26]~A[27]: DB块的编号,⽐如DB50, 就是0x32=50, 两个字节,范围是0~65535(也许是⼀个1个字节,因为没有设置估DB255以上的数据块,所以不知道到底是⼏个字节,姑且认为是2个字节);A[28] : 访问数据块的类型:0x81-input ,0x82-output ,0x83-flag , 0x84-DB(这个最常见);A[29]~A[31]: 访问DB块的偏移量offset (地址+1以byte为单位); 3个字节,范围是0~16777216(⼀般⽤不到这么⼤)程序设计的时候,其实主要关注最后4个信息,即:1. A[24]~A[25]: 访问byte个数2. A[26]~A[27]: DB块编号3. A[28] : 数据块类型4.A[29]~A[31] :访问地址偏移量;相当于⾸地址编号B[1]~B[2]: 03 00 固定报⽂头B[3]~B[4]: 整个读取回复报⽂长度:25+读取长度;B[5]~B[11]: 02 F0 80 32 03 00 00 固定6个字节,和读取请求相同的位置⼏乎⼀样,就 B[9]=0x03 ;A[9]=0x01;B[12]~B[13]: 两个字节,标识序列号,回复报⽂相同位置和这个完全⼀样;范围是0~65535;B[14]~B[15]: 两个字节,固定为00 02;对应读取位置是 00 0E;正好 02+0E=10 ;有点补码的感觉,其实不需要关注规律,反正是固定的;B[16]~B[17]:两个字节,=请求读取的字节数+4;B[18]~B[23]:6个字节,固定为:00 00 04 01 FF 04 ;B[24]~B[25]:两个字节, 请求访问的byte个数*8 ;其实就是以⼆进制为单位的个数;由此可以看出,⼀⼝⽓最多访问的地址个数是8192;B[26]~ 最后⼀个:以offset作为⾸地址,所对应的各个byte的值;程序设计的时候,其实只要关注两个信息:1.校验B[3]~B[4]:校验长度正确;2.B[26]~最后⼀个 :获取对应的值;到这⾥读的处理就算结束了;⼏个⼩注意点:1. 对于不同信号的PLC,除了初始化的CPUSolt不同;正常读/写指令是⼀样的;2.读的时候,都是以byte为单位的,如果程序只需要bit,那么还是以Byte为单位去读,将读出的部分按bit再去分解;3.flag类型到底是什么,不是很清楚,有点类似三菱⾥的M点;这个也不需要去深究,⼀般项⽬⾥主要就是⽤DB块;4.读取的长度如果是N(以byte为单位),那么返回的长度就是N*8(以bit为单位);怎么判断长度是否要*8;主要看后⾯是不是紧挨着数据,如果是数据,就需要*8;offset都是以bit为单位的;5.正常读的操作都是DB块,所以在A[26]~A[27]这个字节写⼊DB块的编号,但是对于input,output,flags这三个类型,是不需要数据块编号的,不过我们可以随便写⼀个DB编号;4.写操作写demo1:西门⼦1200 写 db10.WORD18=0xFFFE=65534; 也就是: DB10.b18=0xFF; DB10.B19=0xFE;PC发出报⽂:(A[3]~A[4]=0x0025=37=读取报⽂总长度, A[12]~A[13]=0x0005=序列号,A[16]~A[17]=0x06=写⼊byte个数(2)+4 , A[23]=0x02=写⼊⽅式为byte, A[24]~A[25]=0x0002=2=写⼊个数count; A[26]~A[27]=0x000A=10=DB10,A[28]=0x84=写⼊的数据类型为DB块,A[29]~A[31]=0x000090=144=18*8=读取偏移量offset(bit为单位),A[32]~A[33]=0x0004=写⼊⽅式为Byte , A[34]~A[35]=0x0010=2*8=写⼊byte的个数(bit为单位) ,A[36]~A[37]= 写⼊数据)03 00 00 25 02 F0 80 32 01 00 00 00 05 00 0E 00 06 05 01 12 0A 10 02 00 02 00 0A 84 00 00 90 00 04 00 10 FF FEPLC回复报⽂:( B[12]~B[13]=0x0565=序列号,最后⼀个B[14]=0xFF表⽰写⼊)03 00 00 16 02 F0 80 32 03 00 00 00 05 00 02 00 01 00 00 05 01 FF1200 写⼊ DB10. X2.6=1 (这⾥是按bit写⼊)PC发出报⽂:(A[3]~A[4]=0x0024=36=读取报⽂总长度, A[12]~A[13]=0x0008=序列号,A[16]~A[17]=0x05=写⼊bit个数(1)+4A[26]~A[27]=0x000A=10=DB10,A[28]=0x84=写⼊的数据类型为DB块,A[29]~A[31]=0x000016=22=2*8+6=读取偏移量offset( bit为单位)A[32]~A[33]=0x0003=写⼊⽅式为bit , A[34]~A[35]=0x0001=写⼊bit的个数(bit为单位) ,A[36]= 写⼊数据[0或1])03 00 00 24 02 F0 80 32 01 00 00 00 08 00 0E 00 05 05 01 12 0A 10 01 00 01 00 0A 84 00 00 16 00 03 00 01 01PLC回复报⽂:( B[12]~B[13]=0x0565=序列号,最后⼀个B[14]=0xFF表⽰写⼊)03 00 00 16 02 F0 80 32 03 00 00 00 08 00 02 00 01 00 00 05 01 FF写demo3:1200 写⼊:output0=4PC发出报⽂:(A[3]~A[4]=0x0024=36=读取报⽂总长度, A[12]~A[13]=0x0008=序列号,A[16]~A[17]=0x05=写⼊byte个数(1)+4 ,A[23]=0x02=写⼊⽅式为byte,A[24]~A[25]=0x0001=1=写⼊个数count; A[26]~A[27]=0x0001=DB1(因为是output,所以DB块编号⽆所谓),A[28]=0x82=写⼊的数据类型为output,A[29]~A[31]=0x000000=读取偏移量offset( bit为单位)A[32]~A[33]=0x0004=写⼊⽅式为byte ,A[34]~A[35]=0x0008=1*8=写⼊byte的个数 ,A[36]= 写⼊数据)03 0000 24 02 F0 80 32 01 00 00 00 08 00 0E 00 05 05 01 12 0A 10 02 00 01 00 01 82 00 00 00 00 04 00 08 04PLC回复报⽂:( B[12]~B[13]=0x0565=序列号,最后⼀个B[14]=0xFF表⽰写⼊)03 00 00 16 02 F0 80 32 03 00 00 00 08 00 02 00 01 00 00 05 01 FF写demo4:1200 写输⼊:output 0.3=1PC发出报⽂:(A[3]~A[4]=0x0024=36=写⼊报⽂总长度, A[12]~A[13]=0x0003=序列号,A[16]~A[17]=0x05=写⼊bit个数(1)+4A[23]=0x01=写⼊⽅式为bit,A[24]~A[25]=0x0001=1=写⼊个数count; A[26]~A[27]=0x000A=10=DB10(因为是output,所以DB块编号⽆所谓),A[28]=0x82=写⼊的数据类型为output,A[29]~A[31]=0x000003=读取偏移量offset( bit为单位)A[32]~A[33]=0x0003=写⼊⽅式为bit , A[34]~A[35]=0x0001=写⼊bit的个数(bit为单位) ,A[36]= 写⼊数据[0或1])03 00 00 24 02 F0 80 32 01 00 00 00 03 00 0E 00 05 05 01 12 0A 10 01 00 01 00 01 82 00 00 03 00 03 00 01 01PLC回复报⽂:( B[12]~B[13]=0x0565=序列号,最后⼀个B[14]=0xFF表⽰写⼊)03 00 00 16 02 F0 80 32 03 00 00 00 03 00 02 00 01 00 00 05 01 FF根据以上4个报⽂的demo,摸索出⼤致规律如下(未必完全正确,但是应付项⽬可以了);A[1]~A[2]: 03 00 固定报⽂头;A[3]~A[4]: 整个报⽂长度:35+写⼊长度;A[5]~A[11]: 02 F0 80 32 01 00 00 固定6个字节(和读取的完全⼀样)A[12]~A[13]: 两个字节,标识序列号,回复报⽂相同位置和这个完全⼀样;范围是0~65535;A[14]~A[15]:00 0E 固定2个字节;A[16]~A[17]:写⼊长度+4;A[18]~A[22]: 05 01 12 0A 10 固定5个⾃⼰A[23] : 写⼊⽅式: 01-按bit写⼊; 02-按byte写⼊;A[24]~A[25]:两个字节,写⼊数据的个数(可能是byte或bit, 按A[23]来区分)A[26]~A[27]: DB块的编号A[28] : 写⼊数据块的类型:0x81-input ,0x82-output ,0x83-flag , 0x84-DB(这个最常见);A[29]~A[31]: 写⼊DB块的偏移量offset (地址+1以byte为单位); 3个字节,范围是0~16777216(⼀般⽤不到这么⼤)A[32]~A[33]:写⼊⽅式为: 03-按bit写⼊; 04-按byte写⼊;A[34]~A[35]:写⼊bit的个数(bit为单位)A[36]~最后:连续的写⼊值;B[1]~B[2]: 03 00 固定报⽂头;B[14]: FF 标识写⼊正常;到这⾥,初始化,读,写这3种⽅式都摸索完了,未必都正确,应付开发应该绰绰有余;在接下来的时间⾥,就需要把这些规律变成相应的程序;注意点:1.写⼊可以按byte和bit两种⽅法去操作;2.对于byte,可以⼀⼝⽓写连续多个byte, 理论上⼀条指令连续写bit也可以,但是实践下来,发现有问题,所以对于bit操作,我们就⼀个⼀个写吧;。