Advertisement
深圳市英威腾电气股份有限公司
Advertisement Advertisement
当前位置:
modbus的新起点
回复 | 人气 | 打印
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-13 16:07:34 楼主

入工控已经五年了。工控的入门似乎很简单,但是一深入下去就效率极低。

五年了,应该做件大事。

为此希望花半年的零散时间,结合我个人调试经验,写一篇关于modbus的鸿篇巨作,也欢迎同行提出意见。

在这里先给大家分享下目前拟定的目录:

第一章 Modbus 基础

1.1 前言:

1.2 Modbus的协议架构:

1.3 Modbus 协议的概要

1.4 Modbus实战分析

1.4.1 Modbus ASCII实战分析

1.4.2 Modbus RTU的实战分析

1.4.3 Modbus TCP抓包分析

1.4.4 RTU/ASCII Over TCP抓包分析

1.5 Modbus 总结及其对比分析

第二章 Modbus 应用

2.1台达PLC与modbus应用

2.1.1 台达PLC modbus RTU/ASCII从站功能

2.1.2 台达PLC Link功能

2.1.3 台达PLC modbusRTU/ASCII主站功能

2.1.4 台达PLC modbus TCP server功能

2.1.5 台达PLC modbus TCP资料交换功能

2.1.6 台达PLC modbus TCP客户端功能

2.2 西门子PLC的modbus应用

2.2.1 西门子S7-200 modbus RTU

2.2.2 西门子smart S7-200 mdobus RTU

2.2.3 西门子s7-1200的modbus TCP

2.2.3 西门子S7-1200的modbus RTU

2.3 AB的modbus的应用

2.3.1 AB micro_850的 ModbusTCP

2.3.2 AB micro_850的 ModbusRTU

2.3.3 AB PLC_AB1769_L32E的 ModbusRTU

2.4 三菱

2.4.1 FX3SA的modbus RTU

2.5 欧姆龙

2.5.1 CP1L的modbus RTU

2.6 松下

2.6.1 松下AFPX的modbus RTU主站

2.6.2 松下AFPX的modbus TCP客户端

2.7 Modbus与C#的应用

2.7.1 C# 编写modbus RTU主站

2.7.2 C# 编写modbus TCP Client

2.7.3 C# 编写modbus RTU Over TCP功能

2.7.4 C# 编写远程modbusDTU服务器


目前才写到台达章节,整理资料需要花不少时间。每周会更新一到两章节。如果有朋友需要,但是我论坛还没更新的时候,可以联系我微信:we9322025。


在此,先奉献第一章的基础篇给大家。

modbus新起点1--基础篇:杨博被提名为内蒙古阿拉善盟盟长 赵文亮不再担任 

modbus新起点连载2--modbus台达篇:傅政华:努力实现重新组建司法部的人员大团结

modbus的新起点连载3——台达PLC的modbus主站:军报:“和平病”是战斗力致命的腐蚀剂

modbus新起点连载4--台达PLC以太网的数据交换:外交部:中美贸易是打或谈?望美方认清形势 

modbus新起点连载5--台达PLC的modbusTCP客户端程序:特朗普在这方面要动手了 中国严阵以待 

modbus新起点连载6——西门子200的modbusRTU: 美对华出口恐跌7成 大豆农急打广告劝特朗普休兵 


正在下载,请等待……
下载附件需0积分!

分享到: 收藏 回复 举报

Advertisement
ZHANGZDH 个人主页 给TA发消息 加TA为好友 发表于:2018-07-13 16:33:01 1楼
 

点击链接进不去的?

  回复 引用 举报
行天-王者之师 个人主页 给TA发消息 加TA为好友 发表于:2018-07-13 16:40:23 2楼
 

谢谢分享,这确实够称得上鸿作了

  回复 引用 举报
草狼_20 个人主页 给TA发消息 加TA为好友 发表于:2018-07-13 16:45:33 3楼
 

很好,满满的都是干货,赞!

  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-13 17:23:51 4楼
 


回复内容:

对: ZHANGZDH 点击链接进不去的? 内容的回复!

-------------------------

我试了电脑可以所以没注意手机

  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-13 17:24:28 5楼
 


回复内容:

对: 草狼_20 很好,满满的都是干货,赞! 内容的回复!

-------------------------

多谢夸奖

  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-13 17:24:41 6楼
 


回复内容:

对: 行天-王者之师 谢谢分享,这确实够称得上鸿作了 内容的回复!

-------------------------

多谢夸奖

  回复 引用 举报
勇士-王者之师 个人主页 给TA发消息 加TA为好友 发表于:2018-07-14 10:26:04 7楼
 

厉害了,感谢分享

  回复 引用 举报
小白助教 个人主页 给TA发消息 加TA为好友 发表于:2018-07-14 21:04:50 8楼
 

厉害了!!!

  回复 引用 举报
佛山大侠 个人主页 给TA发消息 加TA为好友 发表于:2018-07-15 11:43:22 9楼
 

谢谢分享,确实够很有帮助.


  回复 引用 举报
研讨会宣传员_3259 个人主页 给TA发消息 加TA为好友 发表于:2018-07-16 13:47:28 10楼
 

好久不见这样的帖子了,支持你!加油!

  回复 引用 举报
GKstudying 个人主页 给TA发消息 加TA为好友 发表于:2018-07-16 13:47:41 11楼
 


回复内容:可以免费下载的呀

对: ZHANGZDH 点击链接进不去的? 内容的回复!

-------------------------


  回复 引用 举报
GKstudying 个人主页 给TA发消息 加TA为好友 发表于:2018-07-16 13:48:29 12楼
 

多谢楼主分享,后续期待您的大作

  回复 引用 举报
竹叶三—王者之师 个人主页 给TA发消息 加TA为好友 发表于:2018-07-16 16:22:44 13楼
 

此贴已经设置为精华贴,建议楼主把你后面几个帖子的地址整理到这个帖子,这样更方便别人阅读。谢谢。

  回复 引用 举报
艾工 个人主页 给TA发消息 加TA为好友 发表于:2018-07-16 21:45:07 14楼
 

谢谢分享,确实够很有帮助.

  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-17 06:51:06 15楼
 


回复内容:

对: 竹叶三—王者之师 此贴已经设置为精华贴,建议楼主把你后面几个帖子的地址整... 内容的回复!

-------------------------

OK

  回复 引用 举报
清苦人 个人主页 给TA发消息 加TA为好友 发表于:2018-07-17 08:07:13 16楼
 

谢谢分享,确实够很有帮助.

  回复 引用 举报
学习着125 个人主页 给TA发消息 加TA为好友 发表于:2018-07-17 15:07:59 17楼
 

谢谢分享,帮助挺大的

  回复 引用 举报
koofly 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 15:59:58 18楼
 

这个果断的下载了 谢谢楼主

  回复 引用 举报
合作方来给大家 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 16:20:20 19楼
 

不错,希望楼主可以持续下去

  回复 引用 举报
对影成三人 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 16:38:29 20楼
 

可以都是想要的资料

  回复 引用 举报
合作方来给大家 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 17:05:45 21楼
 

看完楼主的文章之后特地回来给你点个赞,支持

  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 18:48:23 --1楼
 

1.4.1 Modbus ASCII实战分析

ModbusASCII常用的报文格式如下:

起始位

设备地址

功能代码

数据区

LRC校验

结束符

1个字节

2个字节

2个字节

n个字节

2个字节

2个字节





CR LF(回车 换行)

 

一、01功能码:读线圈

使用该功能码读取线圈的 1 2000 连续状态,其中0表示Off1表示ON

假设需要读取1号站modbus 地址为0x0A连续的20个线圈状态。

则请求报文为:

PDU标识

起始位

设备地址

功能代码

开始地址

线圈数量

LRC校验

结束符

长度(byte)

1

2

2

4

4

2

2

ASCII

01

01

000A

14

-----

CR LF(回车 换行)

HEX

3A

3031

3031

30303041

30303134

-----

0D 0A

响应报文

PDU标识

起始位

设备地址

功能代码

字节数

线圈状态

LRC校验

结束符

长度(byte)

1

2

2

2

3*2=6

2

2

ASCII

01

01

03


-----

CR LF(回车 换行)

HEX

3A

3031

3031

3033


-----

0D 0A

其中响应的字节数,一个字节是8bit,响应应该有20bit,所以需要3个字节才能表示完20bit,多余的进行补零处理。由于用ASCII码表示需要乘以2,所以变成了6。所以假设读取的coil个数为n,则相应的字节数为n/8,如果有小数,直接加1

PSLRC我就不手动计算了,这一部分需要编写校验算法的时候才能用到。平常很少手动计算。如果后面写到高级语言的modbus编程,会写到。

开启modbus slave,将模式设置成ASCII,站号1,寄存器10,监控数量为20unction设置为01 read Coils,并处于连接状态。

image.png

开启modbus Poll,将模式设置成ASCII,站号1,寄存器10,监控数量为20function设置为01 read Coils,连接连接。

image.png

点击communication查看通讯过程

image.png

其中TX为请求,RX为响应。

复制其中一段报文 解析如下:

TX:请求

报文

Tx:000174-3A 30 31 30 31 30 30 30 41 30 30   31 34 45 30 0D 0A

拆散

3A

30 31

30 31

30 30 30 41

30 30 31 34

45 30

0D 0A

含义

开始符

站号

功能码

线圈地址

线圈数量

LRC

结束符

解析成ASCII

01

 01

000A 

0014 


CR LF

RX:响应

报文

Rx:000175-3A 30 31 30 31 30 33 30 30 30 30   30 30 46 42 0D 0A

拆散

3A

30 31

30 31

30 33

30 30 30 30 30 30

45 30

0D 0A

含义

开始符

站号

功能码

字节数

线圈数量

LRC

结束符

解析成ASCII

01

 01

03 

00000000


CR LF

 

二、02功能码:读取离散输入量

使用该功能码读取离散输入量的 1 2000 连续状态,其中0表示Off1表示ON

请求报文和01功能码很接近。本节中加粗的为需要注意变更的地方。

假设我们读取1号站modbus 地址为0x0A连续的20Input 寄存器的状态。

则请求报文为:

PDU标识

起始位

设备地址

功能代码

开始地址

线圈数量

LRC校验

结束符

长度(byte)

1

2

2

4

4

2

2

ASCII

01

02

000A

14

-----

CR LF(回车 换行)

HEX

3A

3031

3032

30303041

30303134

-----

0D 0A

响应报文

PDU标识

起始位

设备地址

功能代码

字节数

线圈状态

LRC校验

结束符

长度(byte)

1

2

2

2

3*2=6

2

2

ASCII

01

02

03


-----

CR LF(回车 换行)

HEX

3A

3031

3032

3033


-----

0D 0A

开启modbus slave,将模式设置成ASCII,站号1,寄存器10,监控数量为20unction设置为02 Input Staues,并处于连接状态。

image.png

开启modbus Poll,将模式设置成ASCII,站号1,寄存器10,监控数量为20function设置为01 Input Staues,连接连接。

image.png

点击communication查看通讯过程

image.png

其中TX为请求,RX为响应。

复制其中一段报文 解析如下:

TX:请求

报文

Tx:000198-3A 30 31 30 32 30 30 30 41 30 30 31 34 44 46 0D 0A

拆散

3A

30 31

30 32

30 30 30 41

30 30 31 34

44 46

0D 0A

含义

开始符

站号

功能码

线圈地址

线圈数量

LRC

结束符

解析成ASCII

01

 02

000A 

0014 


CR LF

RX:响应

报文

Rx:000199-3A 30 31 30 32 30 33 30 30 30 30   30 30 46 41 0D 0A

拆散

3A

30 31

30 32

30 33

30 30 30 30 30 30

46 41

0D 0A

含义

开始符

站号

功能码

字节数

线圈数量

LRC

结束符

解析成ASCII

01

 02

03 

00000000


CR LF

 

三、03功能码:读取保持寄存器

使用该功能码读取保持寄存器区域1 123个连续的值。

假设我们读取1号站modbus 地址为0x30连续的18个保持寄存器的状态。

则请求报文为:

PDU标识

起始位

设备地址

功能代码

开始地址

寄存器数量

LRC校验

结束符

长度(byte)

1

2

2

4

4

2

2

ASCII

01

3

0030

12

-----

CR LF(回车 换行)

HEX

3A

3031

33

30303330

30303132

-----

0D 0A

响应报文

PDU标识

起始位

设备地址

功能代码

字节数

寄存器的值

LRC校验

结束符

长度(byte)

1

2

2

2

2*2*18=72

2

2

ASCII

01

03

24


-----

CR LF(回车 换行)

HEX

3A

3031

3033

3234


-----

0D 0A

请求的一个寄存器是16bit的,一共18个寄存器,所以需要相应的字节数是18*2=36,转换成16进制为0x24;由于寄存器的值使用ASCII表示,长度需要乘以2,所以需要寄存器的值一共占用了72字节。

开启modbus slave,将模式设置成ASCII,站号1,寄存器48,监控数量为18unction设置为03 Holding Registers,并处于连接状态。

image.png

开启modbus Poll,将模式设置成ASCII,站号1,寄存器48,监控数量为18unction设置为03 Holding Registers,连接连接。

image.png

点击communication查看通讯过程


其中TX为请求,RX为响应。

复制其中一段报文 解析如下:

TX:请求

报文

Tx:000218-3A 30 31 30 33 30 30 33 30 30 30   31 32 42 41 0D 0A

拆散

3A

30 31

30 33

30 30 33 30

30 30 31 32

42 41

0D 0A

含义

开始符

站号

功能码

线圈地址

线圈数量

LRC

结束符

解析成ASCII

01

 02

000A 

0012 


CR LF

RX:响应

报文

Rx:000219-3A 30 31 30 33 32 34 30 30 30 30   30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30   30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30   30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 44 38 0D 0A

拆散

3A

30 31

30 33

32 34

30 30 30 30 30 30 30 30 30 30 30 30 30 30   30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30   30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30   30 30 30 30 30 30

46 41

0D 0A

含义

开始符

站号

功能码

字节数

线圈数量

LRC

结束符

解析成ASCII

01

 02

24

00000000000000000000000000000

00000000000000000000000000000

000000000000


CR LF

 

四、04功能码:读取输入寄存器

04功能码和03功能码在使用上除了功能码的域不一样其他都一样,在此不再赘述,仅仅给出读取1号站modbus 地址为0x30连续的18个输入寄存器的状态的报文格式如下:

请求报文为:

PDU标识

起始位

设备地址

功能代码

开始地址

寄存器数量

LRC校验

结束符

长度(byte)

1

2

2

4

4

2

2

ASCII

01

4

0030

12

-----

CR LF(回车 换行)

HEX

3A

3031

34

30303330

30303132

-----

0D 0A

响应报文

PDU标识

起始位

设备地址

功能代码

字节数

寄存器的值

LRC校验

结束符

长度(byte)

1

2

2

2

2*2*18=72

2

2

ASCII

01

04

24


-----

CR LF(回车 换行)

HEX

3A

3031

3034

3234


-----

0D 0A

有兴趣的可以自己抓包解析一下。

五、05功能码:写单个线圈

05功能码用于修改某个线圈的状态,线圈的状态常用 ON/OFF 表示。十六进制值 0XFF00 请求线圈为 ON。十六进制值 0X0000 请求线圈为OFF。其它所有值均为非法的,并且对线圈不起作用。

假设我们需要在01功能码的监控画面中修改线圈15的状态修改ON

请求报文为:

PDU标识

起始位

设备地址

功能代码

输出地址

输出值

LRC校验

结束符

长度(byte)

1

2

2

4

4

2

2

ASCII

01

05

000F

FF00

-----

CR LF(回车 换行)

HEX

3A

3031

3035

30303046

46463030

-----

0D 0A

响应报文

PDU标识

起始位

设备地址

功能代码

输出地址

输出值

LRC校验

结束符

长度(byte)

1

2

2

2

2*2=4

2

2

ASCII

01

05

000F

FF00

-----

CR LF(回车 换行)

HEX

3A

3031

3035

30303046

46463030

-----

0D 0A

Modbus的设定参看01功能码章节

点击communication查看通讯过程

image.png

其中TX为请求,RX为响应。

复制其中一段报文 解析如下:

TX:请求

报文

Tx:000248-3A 30 31 30 35 30 30 30 46 46 46   30 30 45 43 0D 0A

拆散

3A

30 31

30 35

30 30 30 46

46 46 30 30

45 43

0D 0A

含义

开始符

站号

功能码

输出地址

输出状态

LRC

结束符

解析成ASCII

01

 05

000F 

FF00


CR LF

RX:响应

报文

Rx:000249-3A 30 31 30 35 30 30 30 46 46 46   30 30 45 43 0D 0A

拆散

3A

30 31

30 35

30 30 30 46

46 46 30 30

45 43

0D 0A

含义

开始符

站号

功能码

输出地址

输出状态

LRC

结束符

解析成ASCII

01

 05

000F 

FF00


CR LF

 

06功能码:写单个寄存器

06功能码用于修改某个保存寄存器的值,请求报文格式与05功能码相似。

假设我们需要在01功能码的监控画面中修保存寄存器地址15的状态修改为775(十六进制0x307)。

请求报文为:

PDU标识

起始位

设备地址

功能代码

输出寄存器

输出值

LRC校验

结束符

长度(byte)

1

2

2

4

4

2

2

ASCII

01

06

000F

0307

-----

CR LF(回车 换行)

HEX

3A

3031

3036

30303046

30333037

-----

0D 0A

响应报文

PDU标识

起始位

设备地址

功能代码

输出地址

输出值

LRC校验

结束符

长度(byte)

1

2

2

4

4

2

2

ASCII

01

06

000F

0307

-----

CR LF(回车 换行)

HEX

3A

3031

3036

30303046

30333037

-----

0D 0A

Modbus的设定参看03功能码章节

点击communication查看通讯过程

image.png

其中TX为请求,RX为响应。

复制其中一段报文 解析如下:

TX:请求

报文

Tx:000382-3A 30 31 30 36 30 30 30 46 30 33   30 37 45 30 0D 0A

拆散

3A

30 31

30 35

30 30 30 46

30 33 30 37

45 30

0D 0A

含义

开始符

站号

功能码

输出地址

输出状态

LRC

结束符

解析成ASCII

01

 01

000F 

FF00


CR LF

RX:响应

报文

Rx:000383-3A 30 31 30 36 30 30 30 46 30 33   30 37 45 30 0D 0A

拆散

3A

30 31

30 35

30 30 30 46

30 33 30 37

45 30

0D 0A

含义

开始符

站号

功能码

输出地址

输出状态

LRC

结束符

解析成ASCII

01

 01

000F 

0307


CR LF

 

15功能码:写多个线圈

15功能码能够连续修改线圈区域1~2000个线圈的状态。线圈状态常为 ON/OFF 状态,ON1表示,OFF0表示。由于modbus poll每次只能设置一个寄存器,所以在这小编只写一下报文格式,剩下的后面章节有遇到又在补充。目前假设需要设置线圈地址为0连续的5bitON ON ON OFF OFF0b0001 1100->0x1C

请求报文为:

PDU标识

起始位

设备地址

功能代码

寄存器

起始地址

输出数量

字节数

输出值

LRC

校验

结束符

长度(byte)

1

2

2

4

4

2

4

2

2

ASCII

01

0F

00

0005

01

1C

-----

CR LF(回车 换行)

HEX

3A

3031

3046

3030

30303035

3031

3030313C

-----

0D 0A

响应报文

PDU标识

起始位

设备地址

功能代码

起始地址

输出数量

LRC校验

结束符

长度(byte)

1

2

2

4

4

2

2

ASCII

01

0F

0000

0005

-----

CR LF(回车 换行)

HEX

3A

3031

3046

30303030

30303035

-----

0D 0A

16功能码:写多个寄存器

16功能码能够连续修改1~123个保持寄存器的值。由于modbus poll每次只能设置一个寄存器,所以在这小编只写一下报文格式,剩下的后面章节有遇到又在补充。目前假设需要设置保持寄存器地址为0连续的5个寄存器为0x010x020x030x040x05。则报文为:

请求报文:

请求报文为:

PDU标识

起始位

设备地址

功能代码

寄存器

起始地址

寄存器

数量

字节数

寄存器值

LRC

校验

结束符

长度(byte)

1

2

2

4

4

2

2*2*5=20

2

2

ASCII

01

10

00

0005

0A

0001 0002 0003 0004

0005

-----

CR LF(回车 换行)

HEX

3A

3031

3130

3030

30303035

3041

30303031 30303032

30303033 30303034

30303035

-----

0D 0A

响应报文

PDU标识

起始位

设备地址

功能代码

起始地址

寄存器数量

LRC校验

结束符

长度(byte)

1

2

2

4

4

2

2

ASCII

01

0F

0000

0005

-----

CR LF(回车 换行)

HEX

3A

3031

3046

30303030

30303035

-----

0D 0A


  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 18:54:50 --1楼
 

1.4.2 Modbus RTU的实战分析

Modbus RTU常用的报文格式如下:

起始位

设备地址

功能代码

数据区

CRC校验

T1T2T3..

1个字节

1个字节

n个字节

2个字节

Modbus RTU在起始的时候总至少等待3个或3个以上的空闲等待位。在后面的报文解析中,这个位将会被忽略。

一、01功能码:读线圈

使用该功能码读取线圈的 1 2000 连续状态,其中0表示Off1表示ON

假设需要读取1号站modbus 地址为0x0A连续的20个线圈状态。

则请求报文为:

PDU标识

设备地址

功能代码

开始地址

线圈数量

CRC校验

长度(byte)

1

1

2

2

2

HEX

01

01

000A

0014

-----

响应报文

PDU标识

设备地址

功能代码

字节数

线圈状态

CRC校验

长度(byte)

1

1

1

3

2

HEX

01

01

03


-----

其中响应的字节数,一个字节是8bit,响应应该有20bit,所以需要3个字节才能表示完20bit,多余的进行补零处理。所以假设读取的coil个数为n,则相应的字节数为n/8,如果有小数,直接加1

PSCRC我就不手动计算了,这一部分需要编写校验算法的时候才能用到。平常很少手动计算。如果后面写到高级语言的modbus编程,会写到。

开启modbus slave,将模式设置成RTU,站号1,寄存器10,监控数量为20unction设置为01 read Coils,并处于连接状态。

image.png

开启modbus Poll,将模式设置成RTU,站号1,寄存器10,监控数量为20function设置为01 read Coils,连接连接。

image.png

点击communication查看通讯过程

image.png

其中TX为请求,RX为响应。

复制其中一段报文 解析如下:

TX:请求

报文

Tx:000046-01 01 00 0A 00 14 1C 07

拆散

01

01

00 0A

00 14

1C 07

含义

站号

功能码

线圈地址

线圈数量

CRC

RX:响应

报文

Rx:000047-01 01 03 00 00 00 3C 4E

拆散

01

01

03

00 00 00

3C 4E

含义

站号

功能码

字节数

线圈状态

CRC

 

二、02功能码:读取离散输入量

使用该功能码读取离散输入量的 1 2000 连续状态,其中0表示Off1表示ON

请求报文和01功能码很接近。本节中加粗的为需要注意变更的地方。

假设我们读取1号站modbus 地址为0x0A连续的20Input 寄存器的状态。

则请求报文为:

PDU标识

设备地址

功能代码

开始地址

线圈数量

CRC校验

长度(byte)

1

1

2

2

2

HEX

01

02

000A

0014

-----

响应报文

PDU标识

设备地址

功能代码

字节数

线圈状态

CRC校验

长度(byte)

1

1

1

3

2

HEX

01

02

03


-----

开启modbus slave,将模式设置成CRC,站号1,寄存器10,监控数量为20unction设置为02 Input Staues,并处于连接状态。

image.png

开启modbus Poll,将模式设置成CRC,站号1,寄存器10,监控数量为20function设置为01 Input Staues,连接连接。

image.png

点击communication查看通讯过程

image.png

其中TX为请求,RX为响应。

复制其中一段报文 解析如下:

TX:请求

报文

Tx:000078-01 02 00 0A 00 14 58 07

拆散

01

02

00 0A

00 14

58 07

含义

站号

功能码

线圈地址

线圈数量

CRC

RX:响应

报文

Rx:000079-01 02 03 00 00 00 78 4E

拆散

01

02

03

00 00 00

78 4E

含义

站号

功能码

字节数

线圈状态

CRC

 

三、03功能码:读取保持寄存器

使用该功能码读取保持寄存器区域1 123个连续的值。

假设我们读取1号站modbus 地址为0x30连续的18个保持寄存器的状态。

则请求报文为:

PDU标识

设备地址

功能代码

开始地址

寄存器数量

CRC校验

长度(byte)

1

1

2

2

2

HEX

01

03

0030

0012

-----

响应报文

PDU标识

设备地址

功能代码

字节数

寄存器的值

CRC校验

长度(byte)

2

2

2

18*2

2

HEX

01

03

0024


-----

请求的一个寄存器是16bit的,一共18个寄存器,所以需要相应的字节数是18*2=36,转换成16进制为0x24

开启modbus slave,将模式设置成RTU,站号1,寄存器48,监控数量为18unction设置为03 Holding Registers,并处于连接状态。

image.png

开启modbus Poll,将模式设置成RTU,站号1,寄存器48,监控数量为18unction设置为03 Holding Registers,连接连接。

image.png

点击communication查看通讯过程

image.png

其中TX为请求,RX为响应。

复制其中一段报文 解析如下:

TX:请求

报文

Tx:000234-01 03 00 30 00 12 C5 C8

拆散

01

03

00 30

00 12

C5 C8

含义

站号

功能码

开始地址

寄存器数量

CRC

RX:响应

报文

Rx:000235-01 03 24 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 7B A1

拆散

01

03

24

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

7B A1

含义

站号

功能码

字节数

寄存器状态

CRC

 

四、04功能码:读取输入寄存器

04功能码和03功能码在使用上除了功能码的域不一样其他都一样,在此不再赘述,仅仅给出读取1号站modbus 地址为0x30连续的18个输入寄存器的状态的报文格式如下:

请求报文为:

PDU标识

设备地址

功能代码

开始地址

寄存器数量

CRC校验

长度(byte)

1

1

2

2

2

HEX


34

30303330

30303132

-----

响应报文

PDU标识

设备地址

功能代码

字节数

寄存器的值

CRC校验

长度(byte)

1

1

2

2*18

2

HEX

01

04

24


-----

有兴趣的可以自己抓包解析一下。

五、05功能码:写单个线圈

05功能码用于修改某个线圈的状态,线圈的状态常用 ON/OFF 表示。十六进制值 0XFF00 请求线圈为 ON。十六进制值 0X0000 请求线圈为OFF。其它所有值均为非法的,并且对线圈不起作用。

假设我们需要在01功能码的监控画面中修改线圈15的状态修改ON

请求报文为:

PDU标识

设备地址

功能代码

输出地址

输出值

CRC校验

长度(byte)

1

1

2

4

2

HEX

01

05

000F

FF00

-----

响应报文

PDU标识

设备地址

功能代码

输出地址

输出值

CRC校验

长度(byte)

1

1

2

2

2

HEX

01

05

000F

FF00

-----

Modbus的设定参看01功能码章节

点击communication查看通讯过程

image.png

其中TX为请求,RX为响应。

复制其中一段报文 解析如下:

TX:请求

报文

Tx:000262-01 05 00 0F FF 00 BC 39

拆散

01

05

00 0F

FF 00

BC 39

含义

站号

功能码

线圈地址

强制为ON

CRC

RX:响应

报文

Rx:000263-01 05 00 0F FF 00 BC 39

拆散

01

02

00 0F

FF 00

BC 39

含义

站号

功能码

线圈地址

线圈状态

CRC

06功能码:写单个寄存器

06功能码用于修改某个保存寄存器的值,请求报文格式与05功能码相似。

假设我们需要在01功能码的监控画面中修保存寄存器地址15的状态修改为775(十六进制0x307)。

请求报文为:

PDU标识

设备地址

功能代码

输出寄存器

输出值

CRC校验

长度(byte)

1

1

2

2

2

HEX

01

06

000F

0307

-----

响应报文

PDU标识

设备地址

功能代码

输出地址

输出值

CRC校验

长度(byte)

1

1

2

2

2

HEX

01

06

000F

0307

-----

Modbus的设定参看03功能码章节

点击communication查看通讯过程

image.png

其中TX为请求,RX为响应。

复制其中一段报文 解析如下:

TX:请求

报文

Tx:000262-01 05 00 0F FF 00 BC 39

拆散

01

05

00 0F

FF 00

BC 39

含义

站号

功能码

线圈地址

强制为ON

CRC

RX:响应

报文

Rx:000263-01 05 00 0F FF 00 BC 39

拆散

01

02

00 0F

FF 00

BC 39

含义

站号

功能码

线圈地址

线圈状态

CRC

 

15功能码:写多个线圈

15功能码能够连续修改线圈区域1~2000个线圈的状态。线圈状态常为 ON/OFF 状态,ON1表示,OFF0表示。由于modbus poll每次只能设置一个寄存器,所以在这小编只写一下报文格式,剩下的后面章节有遇到又在补充。目前假设需要设置线圈地址为0连续的5bitON ON ON OFF OFF0b0001 1100->0x1C

请求报文为:

PDU标识

设备地址

功能代码

起始地址

输出数量

字节数

输出值

CRC校验

长度(byte)

1

1

2

2

1

2

2

HEX

01

000F

0000

0005

01

001C

-----

响应报文

PDU标识

设备地址

功能代码

起始地址

输出数量

CRC校验

长度(byte)

1

1

2

2

2

HEX

01

000F

0000

0005

-----

 

16功能码:写多个寄存器

16功能码能够连续修改1~123个保持寄存器的值。由于modbus poll每次只能设置一个寄存器,所以在这小编只写一下报文格式,剩下的后面章节有遇到又在补充。目前假设需要设置保持寄存器地址为0连续的5个寄存器为0x010x020x030x040x05。则报文为:

请求报文:

请求报文为:

PDU标识

设备地址

功能代码

寄存器

起始地址

寄存器

数量

字节数

寄存器值

CRC

校验

长度(byte)

1

1

2

2

1

2*5=10

2

HEX

01

10

00

0005

0A

0001 0002 0003 0004 0005

-----

响应报文

PDU标识

设备地址

功能代码

起始地址

寄存器数量

CRC校验

长度(byte)

1

1

2

2

2

HEX

01

10

0000

0005

-----


  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 18:58:21 22楼
 

1.4.3 Modbus TCP抓包分析

Modbus TCP介绍是在TCP/IP上的MODBUS报文传输服务。Modbus TCP/IP的通信系统包括不同类型的设备:

Ø  连接至 TCP/IP 网络的 MODBUS TCP/IP 客户机和服务器设备。(本章介绍的modbus TCP

Ø  互连设备,例如:在 TCP/IP 网络和串行链路子网之间互连的网桥、路由器或网关,联接,该子网允许将 MODBUS 串行链路客户机和服务器终端设备连接起来。(modbus RTU/ASCII的转换网关)。

image.png

Modbus协议定义了一个与基础通信层无关的简单协议单元(PDU)。特定总线网络上的MODBUS协议能够在应用数据单元(ADU)上引入一些附加域。

image.png

如果用modbus RTU的报文来套用则是,

image.png

如果是modbus TCP的报文的套用则是:

image.png

其中modbus TCPPDUmodbus RTUPDU的内容全部相同。为此后续的介绍中只是介绍了modbus TCP的机制,功能码也只是选取其中一个功能码进行讲解。

Modbus TCP的报文头的组成如下:

事务元标识符

协议标识符号

长度

单元标识符

长度

2字节

2字节

2字节

1字节

描述

用来识别该报文是否已经处理过
  比如计数器。

由于TCP可以可以多路复用,所以需要用一个字段来表示协议编号。
  0:modbus

后面报文的长度。
  PDU的字节数+1

由于需要转换转换给串口,串口中有一个站号。在modbusTCP中没有意义。

由于 modbus TCP是基于 TCP/IP协议之上的应用层协议,所以其连接过程,依然需要遵循TCP的连接过程(握手和挥手环境)。机制如下:

三次握手和四次挥手,握手环节是建立连接的过程,挥手环节是断开连接的过程。中间数据传输的过程就是modbus 报文交互的过程。

 

image.png

下面我们来通过modbus TCP报文的抓包来进行分析。找到抓包文件modbus TCP.pcapngwireshark打开。报文中可以看到交互的过程:

建立连接的三个环节

image.png

中间是modbus交互的环节

image.png

尾部是断开连接的过程:

image.png

建立连接和断开连接,所有的TCP/IP的报文都有这一过程。后面重点解析一段modbus的交互报文。

image.png

从上面第54个编号的请求如上图,下边红色框中内容,是modbus的详细报文。主要分为五部分:二层报文头、三层报文头、传输控制协议头、modbus TCP头、modbus内容。前三个,是TCP/IP的共性,后面两个是modbus所独有的。

展开modbus TCP头和modbus的内容如下:

image.png

Modbus TCP的头一共由四部分组成:

Ø  Transcation Identifier(传输ID,每请求一次加1,从0开始递增)

Ø  Protocol Identifier(协议标识符,0modbus协议)

Ø  Length(长度,后面还有6个字节的长度)

Ø  Unit Identifier(单元标识符,就是从站站号,在modbusTCP中没有意义,在modbus TCP转串口的协议中才会用到(modbus网桥))

Modus通讯内容,这边使用的是0号功能码,这一部分详细内容可以参考modbusRTUdata区域(功能码+长度+数据)。0号功能码就是对应区域就是

Ø  Function Coderead Coils

Ø  Reference Number:来时地址

Ø  Bit count:线圈的个数

接下来我们来看下一下对应的modbus 的响应报文。

image.png

其中响应的 modbus TCP头的报文中,

Ø  Transaction Identifier:与请求的报文相同

Ø  Protocol Identifier:固定为0,表示modbus协议

Ø  Length:的长度由后面报文长度决定

响应中的modbus内容如下:

Ø  Function Coderead coils

Ø  Byte count:数据内容的字节数

Ø  Data0002100000  0000  0000  0010  0001 0000coil491

对应其他功能码的只有modbus内容区域和modbus RTU一样,在这里就不在赘述。


  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 18:59:06 23楼
 

1.4.4 RTU/ASCII Over TCP抓包分析

RTU/ASCII OVER TCP的报文是TCP/IP的头+ASCII/RTU报文组成。同样需要遵循TCP的建立连接和断开连接的过程。与modbus TCP的不同主要在于中间报文。在这里我们打开ASCIIovertcp.pcapng的抓包报文进行查看。建立连接和断开连接我们就不看了。我们直接进入modbus报文交互环节。

image.png

其中data区域,如果大家对前面ASCII章节所讲的内容有映像的话不能认出是modbus ASCII报文:

3a:30:31:30:31:30:30:30:41:30:30:31:34:45:30:0d:0a

具体含义大家可以查一下前面的章节。


  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 19:00:27 24楼
 

1.5 Modbus 总结及其对比分析

Modbus的是一个工控上经常碰到的协议。它由简单的PDU报文分别扩展衍生出其很多分之。

1.5 Modbus 总结及其对比分析

Modbus的是一个工控上经常碰到的协议。它由简单的PDU报文分别扩展衍生出其很多分之。

image.png

由最初的简单协议报文,串口上面衍生出串口报文,在网口上面规划了modbus TCP。串口扩展报文用十六进制(HEX)表示衍生出了RTU,用ASCII表示报文衍生出modbus ASCII。串口报文通过串口服务器后衍生出了over TCP的版本。

网口和串口传输数据的时候,最大差别是速度,在网线直连传输的时候都在10msmodbusTCP就可以完成一次交互,而串口在9600的波特率下传输一次基本在120ms左右;由于网口的可复用性强,可以支持并发。就是一个客户端允许同时向多个服务器拿数据,串口同一时刻永远只能用一有一个请求或者响应在传输;modbus TCP可以支持多主站,串口只能单一主站(注:虽然后来modbus 新增Plus版本有了通过令牌解决多主站问题,但是效率依然是瓶颈);网口可以通过交换机或者路由扩展下去,串口只能通过手拉手方式的接法进行扩展,还受到到距离、站数、导线粗细等问题,导致串口组网比较困难。那么问题回来了串口有这么多问题,为啥没被抛弃呢?便宜就是硬道理,现在网口的一个PLC和串口的一个PLC差价在400多,如果在更早他们的差价更大。

Modbus ASCII新的协议栈设计考虑到的问题比较完善,比较容易区分每个报文的开始和结束,报文的完整性接受比较有保帐。Modbus RTU报文及其精简,传输效率高。相比ASCII码方式RTU的传输到底快多少呢?一个十六进制表示成一个字符,就是说ASCII码传输相同的内容,其长度是RTU的近两倍。由于串口传输都在本地,丢包和错误率偏低,使得ASCII码设计较为鸡肋,RTU获得很多厂商的青睐。

Over TCP起始本质上是一种透传。不止试用modbus协议,也适用于其他协议。只是因为modbus的应用广泛性,衍生出了RTU/ASCII over TCP。但是Over TCP并不能直接接入modbus的总线中。他需要一步将外面封装的TCP头给裁掉。所以Over TCP在现场总线总很少涉及到。但是在远程的系统中,涉及的就比较广。比较典型的就是DTUDTUOver TCP的基础上加了一些特殊的标识符,使得远程的管理更为容易。



由最初的简单协议报文,串口上面衍生出串口报文,在网口上面规划了modbus TCP。串口扩展报文用十六进制(HEX)表示衍生出了RTU,用ASCII表示报文衍生出modbus ASCII。串口报文通过串口服务器后衍生出了over TCP的版本。

网口和串口传输数据的时候,最大差别是速度,在网线直连传输的时候都在10msmodbusTCP就可以完成一次交互,而串口在9600的波特率下传输一次基本在120ms左右;由于网口的可复用性强,可以支持并发。就是一个客户端允许同时向多个服务器拿数据,串口同一时刻永远只能用一有一个请求或者响应在传输;modbus TCP可以支持多主站,串口只能单一主站(注:虽然后来modbus 新增Plus版本有了通过令牌解决多主站问题,但是效率依然是瓶颈);网口可以通过交换机或者路由扩展下去,串口只能通过手拉手方式的接法进行扩展,还受到到距离、站数、导线粗细等问题,导致串口组网比较困难。那么问题回来了串口有这么多问题,为啥没被抛弃呢?便宜就是硬道理,现在网口的一个PLC和串口的一个PLC差价在400多,如果在更早他们的差价更大。

Modbus ASCII新的协议栈设计考虑到的问题比较完善,比较容易区分每个报文的开始和结束,报文的完整性接受比较有保帐。Modbus RTU报文及其精简,传输效率高。相比ASCII码方式RTU的传输到底快多少呢?一个十六进制表示成一个字符,就是说ASCII码传输相同的内容,其长度是RTU的近两倍。由于串口传输都在本地,丢包和错误率偏低,使得ASCII码设计较为鸡肋,RTU获得很多厂商的青睐。

Over TCP起始本质上是一种透传。不止试用modbus协议,也适用于其他协议。只是因为modbus的应用广泛性,衍生出了RTU/ASCII over TCP。但是Over TCP并不能直接接入modbus的总线中。他需要一步将外面封装的TCP头给裁掉。所以Over TCP在现场总线总很少涉及到。但是在远程的系统中,涉及的就比较广。比较典型的就是DTUDTUOver TCP的基础上加了一些特殊的标识符,使得远程的管理更为容易。


  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 19:01:25 25楼
 

2.1台达PLCmodbus应用

台达小型PLC由于其较高的性价比,在中国市场中排名第四。由于手中的资源有限,所以台达PLCmodbus 应用,将围绕DVP-12SE的机型展开。

经过查阅手册收整理12SEmodbus地址表如下:

寄存器

范围

类型

属性

Modbus通訊位址

Modbus通訊位址

(Hex)

(Dec)

S

000~1023

Bit

R / W

0000~03FF

000001~001024

X

000~377 (Octal)

Bit

R

0400~04FF

101025~101280

Y

000~377 (Octal)

Bit

R / W

0500~05FF

001281~001536

T

000~255

Bit

R / W

0600~06FF

001537~001792

Word

R / W

0600~06FF

401537~401792

M

000~1535

Bit

R / W

0800~0DFF

002049~003584

M

1536~4095

Bit

R / W

B000~B9FF

045057~047616

C

0~199

16-bit

Bit

R / W

0E00~0EC7

003585~003784

Word

R / W

0E00~0EC7

403585~403784

200~255

32-bit

Bit

R / W

0EC8~0EFF

003785~003840

Dword

R / W

0EC8~0EFF

403785~403840

D

000~4095

Word

R / W

1000~1FFF

404097~408192

D

4096~11999

Word

R / W

9000~AEDF

436865~444750

为了方便我们的后面的调试,我们编写一个PLC程序让PLC的数据动起来,这样监控的时候就比较方便了。

image.png


  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 19:02:56 26楼
 

2.1.1 台达PLC modbus RTU/ASCII从站功能

台达PLC已经内置了modbus协议,只需要做串口参数的修改即可。其中12SE中的的串口相关的寄存器如下:

image.png

其中D1120的参数如下:

image.png

目前我们编写一个modbus RTU模式下串口(Com2)参数9600,81n

D1120H81

M1143ON

编写modbus的从站参数如下:

image.png

通过usbRS485的线,对PLC进行调试结果如下:
由于在变化的寄存器是D112。而D0~D4095范围的寄存器开始的modbus地址是H1000(换成16进制后是4096),所以D112modbus地址是4096+112=4208

image.png


  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 19:07:37 3--1楼
 

2.1.2 台达PLC Link功能

PLClink功能主要用于实现PLC串口之间的数据交互。台达的PLC使用了17(十六进制)modbus读写指令,其主要实现同时读取一片寄存器之间的区域,并写入另外一寄存器区域。有点像0316功能码的组合版。

具体使用过程:

编写PLC程序,有与PLC默认是1号站,9600,71EAscii码模式。并设置link启动,自动模式。

image.png

ISPsoft软件界面左上角【NWCOMFIG

image.png

进入下面

image.png

拖动Dvp-Series->SE到右边编辑区

image.png

双击PLC1PLC2分别配置串口信息

image.png

拖动上面的串口C2C1进行组网

image.png

将配置好的信息分别下载到PLC中。

选中网络#1  RS485 连线 双击

image.png

点击向右指示箭头

image.png

双击第一条,即可进行数据交换的配置。

配置的画面如下:

image.png

然后点击【确认】

image.png

如有需要还可配置多条

image.png

配置完成之后点击下载并监控

image.png

选择1号站的数据即可看到数据

image.png

其他的特殊使用参看台达的PLC link手册。


  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 19:14:21 28楼
 

2.1.3 台达PLC modbusRTU/ASCII主站功能

台达的modbus 主站可以通过通讯向导来完成。在这里给大家简单介绍一个如何快速获取变频器的运行频率。

场景每隔500ms读取一次变频器的运行频率,存到D101中。

第一步 设定变频器的通讯格式为RTU模式,9600,81e。分别设定参数P89=01P92=04

image.png

image.png

第二步 查找变频器运行频率的modbus地址。查找后为2103H

image.png

第四步 使用PLC的通信向导

1)打开WPLsoft,创建一个空程序

2)在工具栏,找到通讯程序按钮,点击,弹出通讯程序向导

image.png

(3)       选择CCOM2,然后点击“下一步”。配置通讯参数。

条件表达式,设置成LD M1002//程序初始化的时候进行通讯初始化

勾选通讯保存

勾选RTU模式

通讯参数,9600,8,1,E

通讯站号:1

image.png

(4)       配置好通讯参数后点击“下一步”。选择通讯应用指令。

image.png

(5)       在点击下一步,进行通讯参数配置。当M0导通的时候读取变频器的运行频率(H2103)。配置参数如下:

image.png

image.png

(6)       点击“完成”后,自动生成了通讯程序。

image.png

image.png

第五步 修改PLC的通讯程序。由于变频器的频率需要一直读取,所以需要完成对M0的导通控制,才能进行通讯。我的常规习惯是,在通讯完成后的500ms,再次进行频率读取。对M0的信号进行控制。我个人的习惯是,通讯分为请求开始,轮询间隔,通讯复位,超时判断四个阶段。

修改之后如下:

第六步 报文解析。修改完程序之后就算是可以进行通讯了。通过监控可以看到回复的报文:

image.png

参看前面基础篇中的03报文格式

image.png

整理在excel中(从报文中可以看出,一个寄存器表示一个byte):

D0

H0001

站号

D1

H0003

功能码

D2

H0002

字节数

D3

H0011

寄存器值高位

D4

H005C

寄存器的低位

D5

H00B4

CRC高位

D6

H002D

CRC低位

所以变频器的的频率为D3D4的组合H115C

新增解析程序

image.png

D101就是所需的变频器的值。其中有偏移两位小数点就是44.44


  回复 引用 举报
student 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 21:16:52 29楼
 

谢谢分享,确实够很有帮助

  回复 引用 举报
郭远林 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 21:23:27 30楼
 

大师我得向你学习!

  回复 引用 举报
郭远林 个人主页 给TA发消息 加TA为好友 发表于:2018-07-18 21:25:41 31楼
 

我加你微信了,, 

  回复 引用 举报
狼人杀 个人主页 给TA发消息 加TA为好友 发表于:2018-07-19 08:54:04 32楼
 

谢谢楼主的干货。学习了。。

  回复 引用 举报
向南1 个人主页 给TA发消息 加TA为好友 发表于:2018-07-19 10:25:02 33楼
 

大师我得向你学习  

  回复 引用 举报
Smile-lyc 个人主页 给TA发消息 加TA为好友 发表于:2018-07-20 21:45:17 34楼
 

很久没有如此干货了,亲们快接货

  回复 引用 举报
空的用户名 个人主页 给TA发消息 加TA为好友 发表于:2018-07-23 15:09:07 35楼
 

谢谢分享,帮助非常大,正在看这方面的资料

  回复 引用 举报
ww2222w2008 个人主页 给TA发消息 加TA为好友 发表于:2018-07-23 17:56:07 36楼
 

谢谢分享,这确实够称得上鸿作了

  回复 引用 举报
丨丶灬迷失er丨 个人主页 给TA发消息 加TA为好友 发表于:2018-07-24 08:53:36 37楼
 

楼主好人..谢谢楼主分享

  回复 引用 举报
丨丶灬迷失er丨 个人主页 给TA发消息 加TA为好友 发表于:2018-07-24 08:57:14 38楼
 

楼主好人..谢谢楼主分享

  回复 引用 举报
zhangpeng521008 个人主页 给TA发消息 加TA为好友 发表于:2018-07-24 09:45:40 39楼
 

好久不见这样的帖子了,支持你!加油!


  回复 引用 举报
gk2017 个人主页 给TA发消息 加TA为好友 发表于:2018-07-24 10:35:16 40楼
 

好文,必须要学习一下

  回复 引用 举报
过客一号 个人主页 给TA发消息 加TA为好友 发表于:2018-07-24 13:05:09 41楼
 

好资料,感谢分享!

  回复 引用 举报
无疑面对 个人主页 给TA发消息 加TA为好友 发表于:2018-07-24 13:51:57 42楼
 

谢谢分享,帮助挺大的

  回复 引用 举报
lwjlb 个人主页 给TA发消息 加TA为好友 发表于:2018-07-24 17:04:42 43楼
 

多谢分享,学习学习,支持

  回复 引用 举报
嫒肜 个人主页 给TA发消息 加TA为好友 发表于:2018-07-26 10:25:42 44楼
 


回复内容:

对: ZHANGZDH 点击链接进不去的? 内容的回复!

-------------------------


  回复 引用 举报
470759514 个人主页 给TA发消息 加TA为好友 发表于:2018-07-26 13:42:49 45楼
 

继续努力,但是我还是选择看说明书

  回复 引用 举报
we9322025 个人主页 给TA发消息 加TA为好友 发表于:2018-07-26 23:42:07 46楼
 

回复内容:

对:470759514 继续努力,但是我还是选择看说明书     内容的回复:

嘿嘿。手册少了。我也是把这个变成我的调试记录。

  回复 引用 举报
jiasong 个人主页 给TA发消息 加TA为好友 发表于:2018-07-27 11:37:27 47楼
 

已经很多年没有登录工控网站了,今天再次登录,第一次下载的就是你的鸿篇巨制,感谢感谢;

  回复 引用 举报
okma11 个人主页 给TA发消息 加TA为好友 发表于:2018-07-27 11:49:49 48楼
 

非常感谢楼主大神的分享。因为有你让国人的自动化整体水平提高了一个档次

  回复 引用 举报
hillet 个人主页 给TA发消息 加TA为好友 发表于:2018-07-28 00:02:39 49楼
 

必须点赞          学习了

  回复 引用 举报
总条数: | 当前第1/2页 首页 上一页 1 2 下一页 尾页

相关主题
周点击排行
周回复排行
    最新求助
      Advertisement Advertisement