如何用VB实现Modbus串行通讯

2023-10-27

 
如何用 VB 实现 Modbus 串行通讯
在一些应用中可能需要使用诸如 VB 来进行上位机监控程序的开发,而 Modbus 协议是这类应用中首选的通讯协议; Modbus 协议以其简单易用,在工业领域里已广泛的为其他第三方设备所支持。这里对 VB Twido PLC 间的通讯进行说明。
  对于大部分应用, Twido PLC 作为从站,它不需要编制通讯程序,只要把通讯口的参数设置好即可,例如下图表示此 Twido 通过编程口和上位机连接,其站号地址为 2 ;波特率、数据位、校验、停止位和上位机设置保持一致。
  
   VB 程序通过利用 MSComm 控件很容易就能够实现。
   1 通讯口初始化:
   MSComm1.Settings = "9600,n,8,1"
   MSComm1.CommPort = 1
   MSComm1.SThreshold = 0
   If Not MSComm1.PortOpen Then MSComm1.PortOpen = True


2
CRC 校验码的计算方法,如以下函数,可以得到字节数组变量 cmdstring 指向的字符串的 CRC 校验码。
   Function crc16_1(ByRef cmdstring() As Byte, ByVal j As Integer)
   Dim data As Integer
   Dim i As Integer
  
  
   Addressreg_crc = &HFFFF
   For i = 0 To j
   Addressreg_crc = Addressreg_crc Xor cmdstring(i)
   For j = 0 To 7
   data = Addressreg_crc And &H1
   If data Then
   Addressreg_crc = Int(Addressreg_crc / 2)
   Addressreg_crc = Addressreg_crc And &H7FFF
   Addressreg_crc = Addressreg_crc Xor &HA001
   Else
   Addressreg_crc = Addressreg_crc / 2
   Addressreg_crc = Addressreg_crc And &H7FFF
   End If
   Next j
   Next i
  
   If Addressreg_crc < 0 Then
   Addressreg_crc = Addressreg_crc - &HFFFF0000
   End If
  
   HiByte = Addressreg_crc And &HFF
   LoByte = (Addressreg_crc And &HFF00) / &H100
   End Function


3
读多个字的命令(本例是从 2 号站读 %MW10 起始的 4 个字):
   Dim SendStr(7) As Byte
   Dim RcvStr() As Byte
   SendStr(0) = 2 , 从站号是 2
   SendStr(1) = &H3 , 读多个字的命令代码
   SendStr(2) = 0 , 起始地址高字节
   SendStr(3) = 10, 起始地址低字节
   SendStr(4) = &H0, 数据长度高字节
   SendStr(5) = 4 , 数据长度低字节
  
   Call crc16(SendStr(), 5) ,CRC 计算
   SendStr(6) = HiByte
   SendStr(7) = LoByte
   , 读命令发送后 , 当接收 5 + SendStr(5) * 2 个字节时产生中断
   CmdLenth = 5 + SendStr(5) * 2
   MSComm1.RThreshold = CmdLenth
   MSComm1.Output = SendStr , 发送命令
  


4
写多个字的命令(本例是写 2 号站 %MW20 起始的 3 个字):
   Dim WriteStr() As Byte
   k = 6 , 6 个字节
   ReDim WriteStr(8 + k)
  
   WriteStr(0) = 2 , 从站号是 2
   WriteStr(1) = &H10 , 写多个字的命令代码
   WriteStr(2) = 0 , 起始地址高字节
   WriteStr(3) = 20 , 起始地址低字节
   WriteStr(4) = &H0 , 数据长度高字节 < 字的个数 >
   WriteStr(5) = k / 2 , 数据长度低字节 < 字的个数 >
  
   WriteStr(6) = k , 数据长度 < 字节的个数 >
   WriteStr(7) = &H12, 写的第 1 个字的高字节
   WriteStr(8) = &H34, 写的第 1 个字的低字节
   WriteStr(9) = &H56, 写的第 2 个字的高字节
   WriteStr(10) = &H78, 写的第 2 个字的低字节
   WriteStr(11) = &H9A, 写的第 3 个字的高字节
   WriteStr(12) = &HBC, 写的第 3 个字的低字节
  
   Call crc16(WriteStr(), 6 + k)
   WriteStr(9 + (k / 2 - 1) * 2) = HiByte
   WriteStr(10 + (k / 2 - 1) * 2) = LoByte
  
   MSComm1.InBufferCount = 0
   MSComm1.Output = WriteStr
   , 写命令发送后 , 当接收到 8 个字节时中断
   CmdLenth = 8
   MSComm1.RThreshold = CmdLenth


5
通讯事件中断产生时的数据处理:
   Private Sub MSComm1_OnComm()
   Dim inx() As Byte
   Select Case MSComm1.CommEvent
   Case comEvReceive , 判断为接收事件
   MSComm1.InputLen = CmdLenth , 接收数据的长度
   inx = MSComm1.Input , 接收数据
   MSComm1.InBufferCount = 0
  
   For k = 3 To CmdLenth - 3
   tmpstr = tmpstr & "/" & Hex(inx(k))
   Next
   Text1.Text = tmpstr , 以十六进制显示所接收长度的数据
  
  
   Beep
   End Select
   End Sub
 
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用VB实现Modbus串行通讯 的相关文章

  • Windows 上带有 c 的 128 位整数?

    Windows 上有没有能够本地使用 128 位整数的 C 编译器 例如 您可以在 Linux 上使用 gcc 并使用 uint128 t 在 Windows 上还有其他机会吗 如果 128 位也能在 32 位计算机上运行那就太好了 D M
  • 在给定总数、部分数和最大被加数的情况下查找整数分区的数量

    我正在寻找总共 N 个整数分区的数量 其中多个部分为 S 最大部分恰好为 X 而无需枚举所有分区 例如 所有 100 的分区都有 10 个部分 最大部分为 42 我没有找到解决这个问题的定理或分区恒等式 我怀疑这是一个不平凡的问题 不容易从
  • 如何在 C 中使用 write() 函数写入整数? [复制]

    这个问题在这里已经有答案了 我是 C 菜鸟 正在尝试使用write 显示整数的函数 这是我的代码 int n 7 write 1 n 4 我想展示7 但是当我设置时程序没有显示任何内容或其他奇怪的字符n到一个大数字 我缺少什么 类似的对象i
  • Ruby - 如何将消息长度表示为 2 个二进制字节

    我正在使用 Ruby 并且正在与一个网络端点进行通信 该端点需要在发送消息本身之前格式化 标头 标头中的第一个字段必须是消息长度 它被定义为网络字节顺序中的 2 个二进制字节消息长度 例如 我的消息长度是1024 如何将 1024 表示为二
  • Ruby 中的安全整数解析

    我有一根绳子 比如说 123 我想将它转换为整数123 我知道你可以简单地做some string to i 但这会转换 lolipops to 0 这不是我想要的效果 当我试图用一种美好而痛苦的方式转换一些无效的东西时 我希望它在我脸上爆
  • 转换为 int16、int32、int64 - 您如何知道选择哪一个?

    我经常必须转换检索到的值 通常作为字符串 然后将其转换为 int 但在 C Net 中 您必须选择 int16 int32 或 int64 当您不知道检索到的数字有多大时 您如何知道选择哪一个 这里每个提到声明 Int16 保存 ram 的
  • 将位的字符串表示形式转换为字节

    我刚刚开始学习文件压缩 但遇到了一些障碍 我有一个应用程序将诸如 程序 之类的字符串编码为压缩的二进制表示形式 010100111111011000 请注意 这仍然存储为字符串 Encoding g 111 r 10 a 110 p 010
  • 使用字节将字母数字代码解码为键值对象

    我有一个来自 CS GO 游戏的 十字准线代码 CSGO O4Jsi V36wY rTMGK 9w7qF jQ8WB 我可以使用此函数解码一些值 import BigNumber from bignumber js Intentionall
  • 快速字符串到 byte[] 的转换

    目前我正在使用此代码将字符串转换为字节数组 var tempByte System Text Encoding UTF8 GetBytes tempText 我在我的应用程序中经常调用这一行 并且我真的很想使用更快的 如何比默认的 GetB
  • 整数包装对象仅在值 127 内共享相同的实例? [复制]

    这个问题在这里已经有答案了 这里它们是同一个实例 Integer integer1 127 Integer integer2 127 System out println integer1 integer2 outputs true 但这里
  • 如何使用 opencv 从字节显示视频?

    我正在开展一个项目 其中我们使用无线电调制解调器将数据 视频和遥测 从无人机传输到地面站 我们需要做的是实时显示视频 并能够知道 C 中的每一块遥测数据对应哪一帧 数据被解封装为遥测和视频 mpeg4 字节 由于我对 OpenCV 有一些经
  • 我们如何找到 C# 整数数组中的项目计数?

    我需要在 C 数组中查找类型为整数的项目计数 我的意思是 int intArray new int 10 int 0 34 int 1 65 int 2 98 intArray 的项目计数为 3 我在下面找到了 strArray 的代码 但
  • 如何在Python中将列表中的整数相加(对数字列表求和)?

    假设我有一个整数列表 例如 2 4 7 12 3 我怎样才能将所有数字加在一起 以获得28 x 2 4 7 12 3 sum of all numbers sum x 或者你可以尝试这个 x 2 4 7 12 3 sum of all nu
  • 仅使用整数求平方根

    最近 我在某人的编程课上遇到了一个问题 它要求他们仅使用整数来计算平方根 他们用一个整数来表示小数点之前的部分 用另一个整数来表示小数点之后的部分 问题说不允许使用浮点数 然而 经过一段时间的思考 我似乎无法想出一种不使用浮点的方法 我用谷
  • 如何在Java中读取文件的最后“n”个字节

    如何在不使用 RandomAccessFile 的情况下从文件中读取最后 n 个字节 我的文件中的最后 6 个字节包含写回文件时的重要信息 我需要写入原始文件 然后将最后 6 个字节附加到其他地方 有什么指导吗 谢谢 你必须使用随机存取文件
  • JavaScript 中的整数

    MDN https developer mozilla org en JavaScript A re introduction to JavaScript Numbers states JavaScript 中的数字是 双精度 64 位格式
  • Java 中的无符号字节

    Java 中的字节默认是有符号的 我在其他帖子中看到 具有无符号字节的解决方法类似于 int num int bite 0xFF 有人可以向我解释一下为什么它会起作用并将有符号字节转换为无符号字节 然后将其转换为相应的整数吗 ANDing一
  • .NET 中的 base_convert

    NET 是否具有与 PHP 等效的本机功能基数转换 http php net base convert或者我需要自己写 我想从任何基数转换为任何其他基数 其中 to 基数或 from 基数可以是 2 36 的任何整数 PHP 函数示例 ba
  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port

随机推荐

  • 2003文件服务器配置,win2003文件服务器配置

    win2003文件服务器配置 内容精选 换一换 该操作只在跨AZ部署HA场景下才需要执行 EVS无法实现跨AZ磁盘共享 所以在跨AZ部署HA场景中 需要规划三台弹性云服务器 在每台云服务器上各绑定一块SCSI盘并配置iSCSI用作SBD S
  • 知网查论文时怎么筛选核心期刊?

    在知网检索论文时不知道如何筛选出核心期刊进行查看 解决方法如下图
  • 【数据结构】Stack 栈

    数据结构源码 接口 public interface Stack
  • hisi3521叠加OSD水印

    freetype下载安装 下载 https download savannah gnu org releases freetype 解压 tar xvf freetype 2 4 10 tar gz 进入freetype文件目录 cd fr
  • 编译原理三大经典书籍(龙书 虎书 鲸书)

    1 龙书 Dragon book 英文名 Compilers Principles Techniques and Tools 作者 Alfred V Aho Ravi Sethi Jeffrey D Ullman 中文名 编译原理技术和工具
  • 谐振电路 - 01 介绍

    1 定义 对于包含电容和电感及电阻元件的无源一端口网络 其端口可能呈现容性 感性及电阻性 当电路端口的电压U和电流I 出现同相位 电路呈电阻性时 称之为谐振现象 这样的电路 称之为谐振电路 缩写是 LLC 谐振电路的本质是电容中的电场能与电
  • panosim引入新python库提示——SyntaxError: future feature annotations is not defined

    标题错误原因 根本原因是python的版本冲突 高版本python的下载的库给低版本用 背景 panosim自带python为3 6 引入新库的方式为 将其他python版本下载的库放到 Lib site packages下 我用cmd终端
  • 自学黑客(网络安全),一般人我劝你还是算了吧

    一 自学网络安全学习的误区和陷阱 1 不要试图先成为一名程序员 以编程为基础的学习 再开始学习 我在之前的回答中 我都一再强调不要以编程为基础再开始学习网络安全 一般来说 学习编程不但学习周期长 而且实际向安全过渡后可用到的关键知识并不多
  • 解决 WebStorm 很卡的问题

    1 打开安装WebStorm的位置 找到WebStorm exe vmoptions文件 我的文件位置 2 设置 一般最大的设置为1G已经够了 我原来的设置是7百多 Xmx1024m Xms526m 3 如果还不行 再忽略项目中的node
  • Twins:重新思考视觉Transformer中的空间注意力机制

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 Twins Revisiting the Design of Spatial Attention inVision Transformers 单位 美团 阿德莱德大学
  • lora人物训练

    准备好训练的图片 尺寸根据你显卡显存的大小 默认的图片尺寸大小为512 512 显卡显存小于8G的 建议使默认尺寸 如果你的显卡显存可以满足12g或12g以上 推荐使用768 768的图片来训练我们的模型 用大尺寸训练后的模型可以适当减少生
  • MySQL基础之DDL指令

    MySQL基础之DDL指令 数据库 数据表的操作 一 数据库的操作 前言 数据库的命名规则 1 数据库的创建 2 数据库的使用 3 数据库的修改 二 数据表的操作 1 表的创建 2 表的修改 2 1 表中列的修改 2 2 表的修改 一 数据
  • ROS MoveIT1(Noetic)安装总结

    前言 由于MoveIT2的Humble的教程好多用的还是moveit1的环境 所以又装了Ubutun20 04和ROS1 Noetic 2022年12月6日 环境 系统 Ubutun20 04LTS Ros Noetic 虚拟机 VMwar
  • SQL server 实现触发器备份表数据

    在项目里 一个表被增加 需要同步插入的数据 写了一个触发器 需要一个备份表 一个触发器 创建备份表 SELECT INTO PATIENT backup FROM PATIENT 触发器 CREATE TRIGGER dbo Insert
  • 三维图形变换:三维几何变换,投影变换(平行/ 透视 投影)

    通过三维图形变换 可由简单图形得到复杂图形 三维图形变化则分为三维几何变换和投影变换 6 1 三维图形几何变换 三维物体的几何变换是在二维方法基础上增加了对 z 坐标的考虑得到的 有关二维图形几何变换的讨论 基本上都适合三维空间 从应用角度
  • 2023-9-14 数字三角形

    题目链接 数字三角形 include
  • 【AIGC】斯坦福小镇升级版——AI-Town源码解读

    写在前面的话 接上一篇斯坦福小镇升级版 AI Town搭建指南 本本篇将解读 AI Town 使用的技术栈 代码架构 与LLM的交互 以及与斯坦福AI小镇的对比结果 如想直接看结论可跳到文章最后 整体架构 技术栈 AI Town 使用 Ty
  • MATLAB实现列主元高斯消去法

    列主元高斯消去法 function x gauss column A b 输入矩阵A和列向量b 返回解向量x ni nj size b if rank A rank A b 若系数矩阵秩和增广矩阵秩不相等 则无解 fprintf 无解 n
  • 点火开关分为4个档位,分别是off,acc,IG-on,和ST

    off全车除了常火 如应急灯 时钟等的记忆功能 外 均不供电 acc 是附件档 部分车载附属设备供电 如视听系统 仪表灯 灯光等 也就是说 车停在哪里 发动机不转 除了空调不能用外 车内的设备基本都可以用 IG on是汽车点火档 在保证AC
  • 如何用VB实现Modbus串行通讯

    如何用 VB 实现 Modbus 串行通讯 在一些应用中可能需要使用诸如 VB 来进行上位机监控程序的开发 而 Modbus 协议是这类应用中首选的通讯协议 Modbus 协议以其简单易用 在工业领域里已广泛的为其他第三方设备所支持 这里对