工控组态编程温控仪RS485远程数据采集modbus协议软件

本次交流用到的工具清单

开发环境:win7系统

编程软件:易语言、 pcomm模块.ec

调试软件:MODBUS调试软件

硬件清单:

1.K型温控仪带RS485通讯协议

2.RS485串口转USB数据线

3.K型感温探头

4.电源

先上个硬件图


首先我们需要将硬件设备的连接部分要先搞好,我用CAD绘制了一张电路接线图,实际应用可以参照一下

接下来是打开电脑设备管理器 查看串口

我们得知当前温控仪连接上的是COM3端口,然后找一款MOUBUS协议串口调试软件

串口设定为 COM3 波特率设定为9600 效验位无 数据位为8 停止位为2 然后打开串口

按照温控仪说明书 找出他们的通讯代码 填上,通过串口调试软件发送有返回内容 说明这个代码正确


下面部分就用易语言来写代码 实现数据采集,我就不做详解了,懂易语言的朋友直接将代码填入进去就可以测试了。

根据自己喜欢,制作一个窗口界面。

填入代码后 运行看看是否能采集成功

可以看到。自己编写的组态软件已经可以成功采集到数据了。


以下是易语言的全部代码

.版本 2

.支持库 spec

.程序集 窗口程序集_启动窗口

.子程序 _按钮1_被单击

时钟1.时钟周期 = 1000

.子程序 _时钟1_周期事件

时钟1.时钟周期 = 0

时钟2.时钟周期 = 1000

.子程序 _时钟2_周期事件

时钟2.时钟周期 = 0

时钟1.时钟周期 = 1000

.子程序 串口发送, 文本型, 公开

.参数 端口 A, 整数型

.参数 波特率A, 整数型

.参数 数据位数A, 整数型

.参数 效验位A, 整数型

.参数 停止位A, 整数型

.参数 发送的数据, 文本型

.参数 小数点位数, 文本型

.参数 通讯, 整数型

.局部变量 波特率, 整数型

.局部变量 数据位数, 整数型

.局部变量 校验位, 整数型

.局部变量 停止位, 整数型

.局部变量 临时波特率, 文本型

.局部变量 临时数据位数, 文本型

.局部变量 临时效验位, 文本型

.局部变量 临时停止位, 文本型

.局部变量 长度, 整数型

.局部变量 N, 整数型

接收的代码 = “”

小数点 = “”

临时波特率 = 到文本 (波特率A)

临时数据位数 = 到文本 (数据位数A)

临时效验位 = 到文本 (效验位A)

临时停止位 = 到文本 (停止位A)

小数点 = 小数点位数

.如果真 (通讯 ≠ 20170418)

返回 (到文本 (端口 A))

.如果真结束

‘ ==================================================

‘ ————- 波特率选择 ———-

‘ ==================================================

.如果真 (临时波特率 = “110”)

波特率 = #MODE_B110

.如果真结束

.如果真 (临时波特率 = “300”)

波特率 = #MODE_B300

.如果真结束

.如果真 (临时波特率 = “600”)

波特率 = #MODE_B600

.如果真结束

.如果真 (临时波特率 = “1200”)

波特率 = #MODE_B1200

.如果真结束

.如果真 (临时波特率 = “2400”)

波特率 = #MODE_B2400

.如果真结束

.如果真 (临时波特率 = “4800”)

波特率 = #MODE_B4800

.如果真结束

.如果真 (临时波特率 = “9600”)

波特率 = #MODE_B9600

.如果真结束

.如果真 (临时波特率 = “19200”)

波特率 = #MODE_B19200

.如果真结束

.如果真 (临时波特率 = “38400”)

波特率 = #MODE_B38400

.如果真结束

.如果真 (临时波特率 = “57600”)

波特率 = #MODE_B57600

.如果真结束

.如果真 (临时波特率 = “115200”)

波特率 = #MODE_B115200

.如果真结束

.如果真 (临时波特率 = “230400”)

波特率 = #MODE_B230400

.如果真结束

.如果真 (临时波特率 = “460800”)

波特率 = #MODE_B460800

.如果真结束

‘ ==================================================

‘ ————- 数据位选择 ———-

‘ ==================================================

.如果真 (临时数据位数 = “5”)

数据位数 = 0 ‘ 5位数据位

.如果真结束

.如果真 (临时数据位数 = “6”)

数据位数 = 1 ‘ 6位数据位

.如果真结束

.如果真 (临时数据位数 = “7”)

数据位数 = 2 ‘ 7位数据位

.如果真结束

.如果真 (临时数据位数 = “8”)

数据位数 = 3 ‘ 8位数据位

.如果真结束

‘ ==================================================

‘ ————- 校验位选择 ———-

‘ ==================================================

.如果真 (临时效验位 = “NONE”)

校验位 = 0 ‘ NONE 无校验

.如果真结束

.如果真 (临时效验位 = “ODD”)

校验位 = 8 ‘ ODD 奇校验

.如果真结束

.如果真 (临时效验位 = “EVEN”)

校验位 = 24 ‘ EVEN 偶校验

.如果真结束

‘ ==================================================

‘ ————- 停止位选择 ———-

‘ ==================================================

.如果真 (临时停止位 = “1”)

停止位 = 0 ‘ 1位停止位

.如果真结束

.如果真 (临时停止位 = “2”)

停止位 = 4 ‘ 2位停止位

.如果真结束

‘ ===============================================

‘ ————端口启动———————-

‘ ===============================================

.如果 (打开串口 (端口 A) = 0)

.如果 (设置数据到达事件 (端口 A, &数据到达事件, 1) = 0)

.如果 (设置串口 (端口 A, 波特率, 数据位数 + 校验位 + 停止位) = 0)

长度 = 生成代码 (发送的数据)

长度 = 写出字符串 (端口 A, 取变量数据地址 (程_生成的代码), 长度)

读取完毕 = 假

.计次循环首 (5, N)

.如果真 (读取完毕 = 真)

关闭串口 (端口 A)

返回 (接收的代码)

跳出循环 ()

.如果真结束

.计次循环尾 ()

关闭串口 (端口 A)

返回 (“读取失败”)

.否则

关闭串口 (端口 A)

返回 (“设置通讯端口打开失败,请检查是否有此端口”)

.如果结束

.否则

关闭串口 (端口 A)

返回 (“设置数据到达事件失败”)

.如果结束

.否则

关闭串口 (端口 A)

返回 (“通讯端口打开失败,请检查是否有此端口”)

.如果结束

关闭串口 (端口 A)

.子程序 校验码3, 文本型, 公开

.参数 需计算校验码的文本, 文本型

.局部变量 计次, 整数型

.局部变量 校验码, 文本型

校验码 = “65535” ‘ 十六进制“FFFF”

计次 = 1

.计次循环首 (取文本长度 (需计算校验码的文本) ÷ 2, )

校验码 = 进制转换 (到文本 (校验码), 10, 16)

校验码 = 到文本 (位异或 (到整数 (进制转换 (校验码, 16, 10)), 到整数 (进制转换 (取文本中间 (需计算校验码的文本, 计次, 2), 16, 10))))

计次 = 计次 + 2

.计次循环首 (8, )

.如果 (位与 (到整数 (校验码), 1) = 1)

校验码 = 到文本 (位异或 (右移 (到整数 (校验码), 1), 到整数 (进制转换 (“A001”, 16, 10))))

.否则

校验码 = 到文本 (右移 (到整数 (校验码), 1))

.如果结束

.计次循环尾 ()

.计次循环尾 ()

校验码 = 进制转换 (校验码, 10, 16)

.如果真 (取文本长度 (校验码) = 1)

校验码 = “000” + 校验码

.如果真结束

.如果真 (取文本长度 (校验码) = 2)

校验码 = “00” + 校验码

.如果真结束

.如果真 (取文本长度 (校验码) = 3)

校验码 = “0” + 校验码

.如果真结束

校验码 = 取文本右边 (校验码, 2) + 取文本左边 (校验码, 2)

返回 (校验码)

.子程序 进制转换, 文本型, 公开, 。

.参数 被转换文本, 文本型

.参数 被转换进制, 整数型

.参数 转换的进制, 整数型

.局部变量 欲转换文本, 文本型

.局部变量 临时文本, 文本型

.局部变量 临时数值, 长整数型

.局部变量 计次变量, 整数型

.如果真 (被转换进制 < 2 或 转换的进制 < 2 或 被转换进制 > 36 或 转换的进制 > 36) ‘ 判断两个“进制系数”是否正确

返回 (“参数错误-进制只能在2-36之间”)

.如果真结束

被转换文本 = 到大写 (到半角 (被转换文本)) ‘ 规范参数

.计次循环首 (取文本长度 (被转换文本), 计次变量)

临时文本 = 取文本中间 (被转换文本, 计次变量, 1)

.如果真 (寻找文本 (取文本左边 (“
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”, 被转换进制), 临时文本, , 假) = -1)

临时文本 = “参数错误-” + 被转换文本 + “不是一个有效的” + 取文本左边 (数值到金额 (被转换进制, 真), 取文本长度 (数值到金额 (被转换进制, 真)) - 4) + “进制数!”

跳出循环 ()

.如果真结束

.如果真 (计次变量 = 取文本长度 (被转换文本))

临时文本 = “”

.如果真结束

.计次循环尾 ()

.如果真 (临时文本 ≠ “”)

返回 (临时文本)

.如果真结束

‘ 以上为数据处理代码

.如果真 (被转换进制 = 转换的进制)

返回 (被转换文本)

.如果真结束

.计次循环首 (取文本长度 (被转换文本), 计次变量) ‘ 整数转换开始

临时数值 = (寻找文本 (“
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”, 取文本中间 (被转换文本, 计次变量, 1), , 真) - 1) × 求次方 (被转换进制, 取文本长度 (被转换文本) - 计次变量) + 临时数值

.计次循环尾 ()

.判断循环首 (临时数值 > 转换的进制 - 1)

欲转换文本 = 取文本中间 (“
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”, 到数值 (到文本 (临时数值 % 转换的进制)) + 1, 1) + 欲转换文本

临时数值 = 取整 (临时数值 ÷ 转换的进制)

.判断循环尾 ()

欲转换文本 = 取文本中间 (“
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”, 临时数值 + 1, 1) + 欲转换文本 ‘ 整数转换结束

返回 (欲转换文本)

.子程序 十六到十, 长整数型

.参数 十六, 文本型

.局部变量 z

.局部变量 位置1, 文本型

.局部变量 结果, 长整数型

.计次循环首 (取文本长度 (十六), z)

位置1 = 取文本中间 (十六, z, 1)

结果 = (寻找文本 (“0123456789ABCDEF”, 位置1, , 真) - 1) × 求次方 (16, 取文本长度 (十六) - z) + 结果

.计次循环尾 ()

返回 (结果)

.子程序 生成代码, 整数型, , 内

.参数 命令字符串, 文本型, , 如“010321020002”

.局部变量 命令代码, 文本型

.局部变量 临时文本, 文本型

.局部变量 校验码, 文本型

.局部变量 计次, 整数型

.局部变量 i, 整数型

.局部变量 文本长度, 整数型

校验码 = 校验码3 (命令字符串)

命令代码 = 命令字符串 + 校验码

文本长度 = 取文本长度 (命令代码)

计次 = 1

重定义数组 (程_生成的代码, 假, 文本长度 ÷ 2)

.计次循环首 (文本长度 ÷ 2, i)

临时文本 = 取文本中间 (命令代码, 计次, 2)

程_生成的代码 [i] = 到字节 (进制转换 (临时文本, 16, 10))

计次 = 计次 + 2

.计次循环尾 ()

返回 (i - 1)

.子程序 数据到达事件

.参数 串口

.局部变量 读入的字节集, 字节集

.局部变量 计次, 整数型

.局部变量 收到的字节长度, 整数型

.局部变量 临时文本, 文本型

.局部变量 临时分割, 文本型, , “0”

.局部变量 临时, 文本型, , “0”

.局部变量 总数, 整数型

.局部变量 结果, 文本型

.局部变量 i, 整数型

.局部变量 结果1, 文本型

.局部变量 总数1, 整数型

.局部变量 临时1, 文本型, , “0”

.局部变量 i1, 整数型

.局部变量 数值1, 文本型

.局部变量 数值2, 文本型

.局部变量 统计接收次数, 整数型, 静态

.局部变量 临时值, 文本型

.局部变量 读到的频率, 文本型, , “0”

.局部变量 组合, 文本型

读入的字节集 = 取空白字节集 (20)

收到的字节长度 = 读入字符串 (1, 读入的字节集, 20)

.如果真 (收到的字节长度 = 7)

.计次循环首 (收到的字节长度, 计次)

临时文本 = 进制转换 (到文本 (读入的字节集 [计次]), 10, 16)

.如果真 (取文本长度 (临时文本) = 1)

临时文本 = “0” + 临时文本

.如果真结束

接收的代码 = 接收的代码 + 临时文本 + “#”

.计次循环尾 ()

读到的频率 = 分割文本 (接收的代码, “#”, )

组合 = 进制转换 (读到的频率 [4] + 读到的频率 [5], 16, 10)

总数 = 取数组成员数 (临时) - 到整数 (小数点)

.计次循环首 (取数组成员数 (临时), i)

结果 = 结果 + 临时 [i]

.如果真 (i = 总数)

结果 = 结果 + “.”

.如果真结束

.计次循环尾 ()

接收的代码 = 结果

读取完毕 = 真

清除数组 (读到的频率)

.如果真结束

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年5月3日
下一篇 2018年5月3日

相关推荐