modbus协议讲解,上位机与PLC交互

news2024/11/29 1:42:25

开发过程中modbus-RTU需要电脑USB口对外交互,参考我的文章:C# 通过Com端口和单片机通讯(232/485/USB)_花开莫与流年错_的博客-CSDN博客_c#与单片机通信

上位机和PLC交互的消息在Excel中配置,配置后通过Modbus协议加载到界面显示,Excel操作参考我的:C#使用EPPlus操作Excel(读写)_花开莫与流年错_的博客-CSDN博客_epplus读取excel

PLC使用ST语言开发,参考我的文章:汇川中型PLC使用ST语言基础_花开莫与流年错_的博客-CSDN博客_axis_ref_sm3

网络通讯概况

        上学的时候讲过网络7层架构依次为:物理层》数据链路层》网络层》传输层》会话层》表示层》应用层。而实际网络为5层结构物理层》数据链路层》网络层》传输层》应用层

        物理层,通过网线、光纤、双绞线等传输,如485/232。

        数据链路层,负责传输数据,如:以太网协议、PPP协议,CAN协议、i2c、spi等嵌入式协议一般定义了物理层和数据链路层。

        网络层的引入主要是为了屏蔽不同网络的差异,实现不同网络内主机的通信。如:ARP协议(地址解析)、IP协议、ICMP(控制报文协议,路由通不通、消息是否可达、路由是否可用)。

        传输层,每一个应用程序都有一个端口号,用于对外界发送或者接收数据。如重用的TCP、UDP协议。

        应用层,网络结构中最上层,经常被接触到,如web、ftp文件传输、smtp邮件发送等。

Modbus协议

        Modbus采用主从(Master-Salve)通信模式,仅有主设备(Master)能对传输进行初始化,从设备(Slave)根据主设备的请求进行应答。典型的主设备包括现场仪表和显示面板,典型的从设备为可编程逻辑控制器(PLC)。

        主要包含三种协议,Modbus-RTU、Modbus-ASCII和Modbus-TCP。三种协议数据格式基本一致。其中RTU英文“ Remote Terminal Unit”属于传输层、传输数据是协议定义的正整数,电脑直接通过串口与设备交互,因为TCP层有校验参数是否正常,而传输层没有,所以RTU需要计算校验码用于验证是否是正确的modbus报文。Modbus-ASCII主要区别是以ASCII格式传输数据。Modbus-TCP则数据应用层,基于TCP传输。

协议报文(走TCP不需要附加地址和校验,因为TCP有校验位了)

 PLC做主上位机为从时,上位机提供502服务端口,PLC发上位机回。PLC做从则与之相反。

 

 发收报文如下(事物处理标识符为0应该也可以)

 modbus协议完整的文档,我有,不过我还是描述我们经常用到的吧,我之前开发只用到0x03查询、0x06设单个、0x10设多个、0x41自定义(升级单板、读取电子标签)。

0x03查询命令

 0x06设置单个参数

 0x10设置多个参数:00 01 00 00 00 13 FF 10 03 E8 00 06 0C 00 24 0B 95 00 00 00 00 00 00 00 00

 校验备份C++代码

/**
  * @brief modbus rtu校验
  * @param p_data:要校验的数据的地址
  *        data_len:要校验数据的长度(字节)
  *        data_crc:数据的校验码
  * @retval 无
  */
void CRC_Checkout_16(uint8_t *p_data,uint32_t data_ len,uint8_t *data_crc)
{
  uint16_t wcrc = 0xFFFF; 
  uint8_t temp; 
  uint32_t i=0,j=0; 
  for(i=0;i<data_len;i++) 
  {
    temp = *p_data & 0X00FF; 
    p_data++; 
    wcrc = wcrc^temp; 
    for(j=0;j<8;j++) 
    {
      if(wcrc & 0X0001) 
      {
        wcrc>>=1; 
        wcrc^=0XA001; 
      }
      else 
      {
        wcrc>>=1; 
      }
    }
  }
  temp=wcrc;

  data_crc[0]=wcrc; 
  data_crc[1]=wcrc>>8; 

  return ;
}

/* CRC 高位字节值表 */
static unsigned char auchCRCHi[] = 
{
  0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
  0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;

/* CRC低位字节值表*/
static char auchCRCLo[] =
 {
  0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
  0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
  0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
  0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
  0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
  0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
  0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
  0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
  0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
  0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
  0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
  0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
  0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
  0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
  0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
  0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
  0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
  0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
  0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
  0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
  0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
  0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
  0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
  0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
  0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
  0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之-队列实现

队列是一个先进先出的结构&#xff0c;可以用链表呀&#xff0c;数组来实现它&#xff0c;我们今天用数组实现个队列&#xff0c;以优先级队列方式&#xff0c;我们看看怎么实现&#xff0c;优先级队列以队列存储时规则会将即将过期的或较小的数据存储在前面&#xff0c;这样取…

【生成式网络】入门篇(四):CycleGAN 的 代码和结果记录

CycleGAN是一个里程碑式的工作&#xff0c;开启了unpaired的风格迁移的先河&#xff0c;斑马转马的效果还是很震惊。 具体原理可以参考 https://zhuanlan.zhihu.com/p/402819206 老习惯&#xff0c;直接上code&#xff0c;然后按照code进行一些解释 代码参考自 https://github.…

自托管书签管理器LinkAce

本文完成于 9 月下旬&#xff0c;当时的版本是 v1.10.4&#xff0c;发稿时最新版本为 v1.10.5 什么是 LinkAce &#xff1f; LinkAce 是一个自托管档案&#xff0c;用于收集您喜爱的网站的链接&#xff0c;并保存文章以供日后阅读。LinkAce 提供了一个长期存档来存储指向网站、…

NVIDIA 7th SkyHackathon(二)开发套件的安装与测试

1.NeMo 开源工具包 1.1 关于 NeMo NeMo&#xff08;Neural Modules&#xff09;是 NVIDIA 发布的基于 PyTorch 的开源工具包&#xff0c;它允许开发者快速构建、训练和微调会话式人工智能模型 NeMo 由 NeMo Core 和 NeMo Collection 组成&#xff0c;NeMo Core 为所有模型和…

[附源码]Python计算机毕业设计Django的中点游戏分享网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

内容理解之情感计算

导语 概念定义&#xff1a;情感计算是自然语言处理领域的重要研究方向之一&#xff0c;其目标是赋予计算机类似于人一样的观察、理解和生成各种情感表达的能力&#xff0c;它是一个高度综合化的跨学科领域&#xff0c;涉及计算机科学、心理学、社会学和认知科学等。通过多学科…

物联网卡有哪些类型

伴随着科学技术的不断升级&#xff0c;不断发展&#xff0c;5G和物联网必定成为未来生活的主角&#xff0c;而现在5G已经慢慢在我们生活越来越常见&#xff0c;这是我们肉眼可以看见的&#xff0c;其实物联网如同5G一样&#xff0c;在我们生活中也随处可见&#xff0c;如我们平…

谈谈Go语言中函数的本质

在很多编程语言中&#xff0c;都会有函数一说&#xff0c;今天我们来聊聊Go语言中的函数。 废话不多说&#xff0c;咱们直接上代码~ 代码 package mainimport "fmt"func main() {fmt.Printf("%T\n", function1)fmt.Printf("%T\n", function2)…

跨越速运如何构建实时统一的运单分析

作者&#xff1a;张杰&#xff0c;跨越速运大数据架构师&#xff08;本文为作者在 StarRocks Summit Asia 2022 上的分享&#xff09; 作为大型现代化综合速运企业&#xff0c;跨越速运拥有 3000 多家服务网点 &#xff0c;日均处理 30 多万票运单。海量运单数据涌来&#xff…

博科交换机使用

博科交换机使用 ip查询 博科交换机的默认IP地址是10.77.77.77&#xff0c;用户名admin&#xff0c;密码&#xff1a;password。 ipaddrshowip修改 ipaddrset端口查询 交换机的端口表示为&#xff08;A,B&#xff09;或者&#xff08;A,B;C,D&#xff09;。 A,C表示交换机的…

使用JLINK给GD32下载程序

使用JLINK给GD32下载程序关于GD32单片机需要的工具和软件包①Jlink仿真器一个②相关软件包下载准备①选择好芯片②在DEBUG中选择JLINK下载现象总结关于GD32单片机 GD32是兆易创新基于Arm Cortex-M内核和RISC-V内核&#xff0c;推出的32位通用微控制器&#xff0c;对比了下两者…

[附源码]Python计算机毕业设计SSM流浪宠物申领信息平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Java中进制基础知识与算法题

本篇文章旨在给大家普及下计算机内部数据的机器级表示方式&#xff0c;即&#xff1a;二进制、八进制、十进制、十六进制… 对于进制&#xff0c;我们从小最先接触的是十进制&#xff0c;这个也是我们日常生活中应用最多的数值统计方式。然而&#xff0c;现实中我们感觉到的媒体…

python的opencv操作记录(十)——图像融合

文章目录前言opencv中的一个方法泊松融合图像梯度图像散度融合图像散度通过散度场进行图像重建泊松融合的一般逻辑前言 最近碰到一个项目上的难题&#xff0c;是要从电动显微镜对焦的多张图像进行融合。因为&#xff0c;显微镜物镜的景深范围较小&#xff0c;可能在同一视野中…

地理空间数据共享资源大汇总

1.全国12.5米分辨率ALOS高程数据 全国12.5米分辨率DEM数据&#xff0c;该数据由锐多宝的地理空间提供并进行分省裁剪与镶嵌&#xff0c;由测绘营地进行影像坐标系转换。 ALOS-12.5m高程数据参数&#xff1a; 覆盖范围&#xff1a;全国&#xff08;仅有小部分区域存在数据空白…

本机使用python操作hdfs搭建及常见问题

一.虚拟机安装CentOS7并配置共享文件夹 二.CentOS 7 上hadoop伪分布式搭建全流程完整教程 三.本机使用python操作hdfs搭建及常见问题 四.mapreduce搭建 五.mapper-reducer编程搭建 本机使用python操作hdfs搭建及常见问题一、环境搭建1.打开虚拟机系统&#xff0c;打开hadoop2.修…

【JavaScript 逆向】极验四代滑块验证码逆向分析

前言 相较于三代滑块&#xff0c;四代的逻辑流程更简短&#xff0c;底图没混淆&#xff0c;某些点校验不严格 声明 本文章中所有内容仅供学习交流&#xff0c;相关链接做了脱敏处理&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 案例目标 滑动验证码&…

[NAS] QNAP/威联通 常用设置和操作

&#x1f341;简介 QNap 产品是一种可扩展的数据存储解决方案。它们包括具有 1 到 30 个驱动器托架的设备&#xff0c;并提供 HDMI、Thunderbolt 2 和 USB 3.1 等连接选项&#xff0c;以及 802.11ac/a/n Wi-Fi 和高达每秒 40 Gb 的以太网。内置软件提供基本服务&#xff0c;例如…

WeetCode2滑动窗口系列

一丶[无重复字符的最长子串](3. 无重复字符的最长子串 - 力扣&#xff08;Leetcode&#xff09;)# 思路:# 维护一个窗口&#xff0c;窗口中不存在重复的字符&#xff0c;窗口右边界从第一个字符移动到最后&#xff0c;使用一个变量记录窗口大小的最大值 那么问题就变成了&…

浅谈h264和h265的区别

相比h264&#xff0c;压缩同样的视频获得同样的质量的情况下&#xff0c;h265可以做到压缩后的大小为前者的一半&#xff0c;但压缩时间复杂度增加。h264编码单元为宏块(MB)&#xff0c;最大划分为16x16&#xff0c;而h265编码单元为编码树单元(CTU)&#xff0c;最大划分为64x6…