关于设备连接有人云的使用及modbus rtu协议,服务器端TCP调试设置端口号开启


之前的一个项目,再拿出来回顾下。

调试过程

  1. 先 要在有人云,用手机号注册一个服务账号,官网显示目前只支持手机号注册。

  2. 再添加一个网关,一般的设备而言,选择不添加SN方式。设置好后,会自动生成一个账号和密码在这里插入图片描述
    这个是要配置到设备的GM5端的。

  3. 添加设备
    点击【设备管理】—【设备列表】—【添加设备】,其他的设置都是比较简单的,详细可以参考官方文档。这里重点说下,关联设备模板,这个也是自己不是很理解的点。 --> 此步官方文档说是为设备配置变量,添加点表。其表述如下:设备模板,它具备批量管理设备的通讯协议、采集方式、变量(点表)采集规则的能力。这里主要指的是modbusRTU标准的协议。所以得对这个协议了解下,详见问题部分。
    这里要注意,设置 寄存器时的问题,和组态软件是一样的,都要将要设置的值+1。也就是实际协议用到值是减1,如读寄存器功能码为03,但要设置成04 ,起始地址为00,就要设置成01。显示的就是4001,这里是寄存器的概念,而不是字节,指第1个寄存器,1个寄存器用16位表示。

  4. 设置GM5模块,通过程序来实现的话,主要就是设置这些选项

#define AT_HEART                  "AT+HEARTEN=ON"
#define AT_HEARTP                 "AT+HEARTTP=COM"
#define AT_HEARTDT                "AT+HEARTDT=773467"//w4g
#define AT_HEARTTM                "AT+HEARTTM=30"   //heart set

#define AT_REG                    "AT+REGEN=ON"
#define AT_REGTP			      "AT+REGTP=CLOUD"
#define AT_CLOUD				  "AT+CLOUD=00052025000000000001,ZLEc9aUg"


完整的设置流程参考如下:
>[Tx->][15:06:07][asc]
+++
>[Rx<-][15:06:07][asc]
a
>[Tx->][15:06:07][asc]
a
>[Rx<-][15:06:07][asc]
+ok

执行完毕
>[Tx->][15:06:10][asc]
AT+SAFEATEN?

>[Rx<-][15:06:10][asc]

+SAFEATEN:OFF

OK

>[Tx->][15:06:10][asc]
AT+WKMOD=NET

>[Rx<-][15:06:10][asc]

OK

>[Tx->][15:06:10][asc]
AT+SOCKAEN=ON

>[Rx<-][15:06:10][asc]

OK

>[Tx->][15:06:10][asc]
AT+SOCKA=TCP,52025.cnsh.iot-tcp.com,15000

>[Rx<-][15:06:10][asc]

OK

>[Tx->][15:06:10][asc]
AT+SOCKASL=LONG

>[Rx<-][15:06:10][asc]

OK

>[Tx->][15:06:10][asc]
AT+SHORTATM=10

>[Rx<-][15:06:10][asc]

OK

>[Tx->][15:06:11][asc]
AT+SOCKABKEN=OFF

>[Rx<-][15:06:11][asc]

OK

>[Tx->][15:06:11][asc]
AT+SOCKBEN=OFF

>[Rx<-][15:06:11][asc]

OK

>[Tx->][15:06:11][asc]
AT+SOCKBBKEN=OFF

>[Rx<-][15:06:11][asc]

OK

>[Tx->][15:06:11][asc]
AT+SOCKCEN=OFF

>[Rx<-][15:06:11][asc]

OK

>[Tx->][15:06:11][asc]
AT+SOCKCBKEN=OFF

>[Rx<-][15:06:11][asc]

OK

>[Tx->][15:06:11][asc]
AT+SOCKDEN=OFF

>[Rx<-][15:06:11][asc]

OK

>[Tx->][15:06:11][asc]
AT+SOCKDBKEN=OFF

>[Rx<-][15:06:11][asc]

OK

>[Tx->][15:06:11][asc]
AT+SOCKRSTIM=5

>[Warn][15:06:11]

+CME ERROR:53

>[Tx->][15:06:11][asc]
AT+SOCKRSNUM=60

>[Rx<-][15:06:11][asc]

OK

>[Tx->][15:06:11][asc]
AT+HEARTEN=ON

>[Rx<-][15:06:11][asc]

OK

>[Tx->][15:06:11][asc]
AT+HEARTTM=30

>[Rx<-][15:06:12][asc]

OK

>[Tx->][15:06:12][asc]
AT+HEARTTP=COM

>[Rx<-][15:06:12][asc]

OK

>[Tx->][15:06:12][asc]
AT+HEARTSORT=USER

>[Rx<-][15:06:12][asc]

OK

>[Tx->][15:06:12][asc]
AT+HEARTDT=773467

>[Rx<-][15:06:12][asc]

OK

>[Tx->][15:06:12][asc]
AT+REGEN=ON

>[Rx<-][15:06:12][asc]

OK

>[Tx->][15:06:12][asc]
AT+REGSND=LINK

>[Rx<-][15:06:12][asc]

OK

>[Tx->][15:06:12][asc]
AT+REGTP=CLOUD

>[Rx<-][15:06:12][asc]

OK

>[Tx->][15:06:12][asc]
AT+CLOUD=00052025000000000001,12345678

>[Rx<-][15:06:12][asc]

OK

>[Tx->][15:06:12][asc]
AT+UART=115200,8,1,NONE,NONE

>[Rx<-][15:06:12][asc]

OK

>[Tx->][15:06:12][asc]
AT+UARTFT=50

>[Rx<-][15:06:12][asc]

OK

>[Tx->][15:06:12][asc]
AT+UARTFL=1024

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+E=OFF

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+CMDPW=usr.cn#

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+STMSG=[USR-G771]

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+APN=CMNET,,

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+RSTIM=1800

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+NATEN=OFF   //默认On

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+UATEN=OFF    //默认on

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+CACHEN=OFF   //默认On

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+SAFEATEN=OFF

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+NTPEN=OFF

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+NTPTM=1

>[Rx<-][15:06:13][asc]

OK

>[Tx->][15:06:13][asc]
AT+NTPSVR=

>[Warn][15:06:14]

+CME ERROR:53

>[Tx->][15:06:14][asc]
AT+S

>[Rx<-][15:06:14][asc]

OK




云端发送的数据为:01 03 00 00 00 01 84 0A

crc16 在线计算网址为https://www.23bei.com/tool/59.html

问题

1. 关于modbus rtu协议,实质上有三种

Modbus RTU(Remote Terminal Unit 远程终端单元):这种方式常采用RS-485做为物理层,一般利用芯片的串口实现数据报文的收发,报文数据采用二进制数据进行通信。
Modbus ASCII :报文使用 ASCII 字符。ASCII 格式使用纵向冗余校验和。Modbus ASCII 报文由冒号 (“:”)开始 和换行符 (CR/LF) 结尾构成。
Modbus TCP,上面两种支持串口,而Modbus TCP是最近开发的协议扩展,允许Modbus协议通过TCP / IP网络传输。 通过网络进行通信的固有延迟和其他方面,需要对如何保持请求和响应彼此同步进行一些修改,并确保不从从设备接收错误数据。

与Modbus RTU相比,Modbus TCP在PDU的包装方式上有所不同。 包含PDU的TCP帧以2字节的MODBUS应用协议(MBAP)事务标识符开始,而不是从ID。 当TCP层处理该功能时,也不需要CRC执行错误检查。
参照人家的写的,多熟悉下。

modbus基本原理

由于要进行通信,所以要有传输数据的存储区,线圈,表示的是位,而寄存器,表示的占16个位,数据,也就是说表示的是最小单位,至于为什么叫这些名字,主要是modbus最初就是为了解决电线多了之后乱的问题。

存储区的范围:5位标准地址(也有扩展到6位的),Y XXXX//第一位表示哪个存储区,后面4位表示地址,表示类型的位,没有2,这个是规定好的。也没有0000这个地址,而是从0001开始
线圈寄存器(Coil Register)(输出线圈)bool、00001 - 09999、可读可写
离散输入寄存器(Discrete Input Register)(输入线圈)bool、10001 - 19999、只读
输入寄存器(Input Register)16位值、30001 - 39999、只读
保持寄存器(Holding Register)(输出寄存器)16位值、40001 - 49999、可读可写
存储区的概念仅是为了人与人之间交流,理解之用,实际协议使用的是后面的地址,因为前面根据功能码可以判断出读、写的类型

关于功能码编码问题:有两种类型数据 寄存器和线圈 + 两种操作 可读可写 + 写两种方式 一次是单个还是多个,也就是说总共有6种组合。读输出线圈 01 读输入线圈 02 读输出寄存器 03 读输入寄存器 04 写单个线圈 05 写单个寄存器06
写多个输出线圈 15 写多个输出寄存器 16(十进制表示)

modbus 格式

modbus主要采用主请求,从应答的方式,也就是主机要数据,其数据结构都是:

  1. 地址:1个字节 ,取值范围是0-247,如果是0,就是主站广播报文;如果是1-247,则有可能是主站请求或者从站应答。
  2. 功能码:1个字节,也就是报文命令,代表主站对从站的操作,读或者写
  3. 数据:0~ 252个字节,数据字段,主请求报文,从应答报文会有所差异。也就是说假设抓取总线报文,如何区分是主站请求还是从站应答,则需要通过数据字段进行区分了。
  4. CRC校验:2 个字节 采样CRC16,16位循环冗余校验。
    基本的读取通信流程: 主机发送,写其是一样的
      第1 字节ARD : 从机地址码(=001~254)
      第 2 字节03H : 读寄存器值功能码
      第3、4 字节 : 要读的寄存器开始地址,这个对应的就是寄存器的起始地址设置
      第5、6 字节 : 要读的寄存器数量 ,这个对应的是数据格式设置部分
      第7、8 字节 : 从字节1 到6 的CRC16 校验和
      从机应答:
      第1 字节ARD : 从机地址码(=001~254)
      第2 字节03H : 返回读功能码
      第3 字节 : 字节总数,字节计数
      第4~7 字节 : 寄存器数据
      第8、9 字节 : 从字节1 到7 的CRC16 校验和

2. 关于modbus crc16通信校验

在线计算crc16网址为:crc16校验

 /***********************CRC查表法校验*************************/
 // CRC 高位字节值表
unsigned char  auchCRCHi[260] = {
    
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
  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
AT命令手册 网上找到的共享出来给大家学习 1 简介.............................................. 5 1.1 名词术语........................................ 5 1.2 AT 命令简介..................................... 5 2 AT 命令祥解....................................... 5 2.1 一般命令........................................ 5 2.1.1 AT+CSCS 选择TE 字符集 2.1.2 AT+CIMI 请求IMSI 2.1.3 AT+GCAP 性能列表 2.1.4 A/ 重复刚才的命令 2.1.5 AT^SMSO 关闭电源 2.1.6 AT+CMEE 报告ME 错误 2.2 呼叫控制命令.................................... 6 2.2.1 ATD 拨号 2.2.2 ATH 呼叫挂起 2.2.3 ATA 呼叫应答 2.2.4 AT+CEER 扩展错误报告 2.2.5 AT+VTS, AT+VTD DTMF 信号 2.2.76ATS0 自动应答 2.3 网络业务命令.................................... 8 2.3.1 AT+CSQ 信号质量 2.3.2 AT+COPS 运营商选择 2.3.3 AT+CREG 网络注册 2.4 安全性命令...................................... 10 2.4.1 AT+CPIN 输入PIN 码 2.4.2 AT+CPIN2输入PIN2 码 2.4.3 AT+CPINC PIN 码剩余尝试次数 2.4.4 AT+CLCK 功能锁定 2.4.5 AT+CPWD 更改密码 2.5 电话本命令...................................... 14 2.5.1 AT+CPBS 选择电话本存储区 2.5.2 AT+CPBR 读取电话本 2.5.3 AT+CPBW 写电话本 2.6 短消息命令...................................... 15 2.6.1 参数定义 2.6.2 AT+CSMS 选择消息业务 2.6.3 AT+CPMS 选择短消息存储区 2.6.4 AT+CMGF 选择消息格式 2.6.5 AT+CSDH 显示 TEXT 方式参数 2.6.6 AT+CNMI 新消息提示 2.6.7 AT+CMGR 读取短消息 2.6.8 AT+CMGL 列举短消息 2.6.9 AT+CMGS 发送短消息 2.6.10 AT+CMGW 向内存写入消息 2.6.11 AT+CMSS 发送存储区内的消息 2.6.12 AT+CSMP 设置 TEXT 方式参数 2.6.13 AT+CMGD 删除短消息 2.6.14 AT+CSCA 设置短消息中心地址 2.6.15 AT+CSCB 选择广播消息类型 南京傲屹电子有限公司 地址 南京市湖南路 185 号 电话 025-3241656 3204539 网址 www.cnaye.com 第 2 页 共 32 页 GSM AT 命令手册 2.7 补充业务命令.................................... 22 2.7.1 AT+CCFC 呼叫转移 2.7.2 AT+CLCK 呼叫限制 2.7.3 AT+CPWD 更改补充业务密码 2.7.4 AT+CLIP 呼叫线路识别显示 2.7.5 AT+CHLD 呼叫保持 2.7.6 AT+CLCC 列举当前的电话 2.7.7 AT+CSSN 补充业务通知 2.7.8 AT+CCUG 用户组业务 2.8 数据命令..........................................26 2.8.1 AT+CBST 载波类型选择 2.8.2 AT+FCLASS 选择模式 2.8.3 AT+CR 业务报告控制 2.8.4 AT+CRC 振铃类型结果码 2.8.5 AT+ILRR DTE-DCE 本地波特率报告 2.8.6 AT+CRLP 无线链路协议参数 2.9 传真命令......................................... 28 2.9.1 AT+FTM 传送速度 2.9.2 AT+FRM 接收速度 2.9.3 AT+FTS 停止传送并等待 2.9.4 设置PC 传真应用程序 2.10 串口控制命令.................................... 29 2.10.1
以下是一个简单的 C# MODBUS RTU 协议连接 ATEQ 设备的示例代码: ```csharp using System; using System.IO.Ports; namespace ModbusRTU { public class ATEQDevice { private SerialPort _serialPort; public ATEQDevice(string portName) { _serialPort = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One); _serialPort.Open(); } public byte[] ReadHoldingRegisters(int startAddress, int count) { byte[] data = new byte[8]; data[0] = 0x01; // slave address data[1] = 0x03; // function code data[2] = (byte)(startAddress >> 8); // start address high byte data[3] = (byte)(startAddress & 0xFF); // start address low byte data[4] = (byte)(count >> 8); // count high byte data[5] = (byte)(count & 0xFF); // count low byte ushort crc = CalculateCRC(data, 6); data[6] = (byte)(crc & 0xFF); // crc low byte data[7] = (byte)(crc >> 8); // crc high byte _serialPort.Write(data, 0, 8); byte[] buffer = new byte[3 + 2 * count]; _serialPort.Read(buffer, 0, 3 + 2 * count); if (buffer[0] != 0x01 || buffer[1] != 0x03 || buffer[2] != 2 * count) { throw new Exception("Invalid response"); } byte[] result = new byte[count * 2]; Buffer.BlockCopy(buffer, 3, result, 0, result.Length); return result; } private ushort CalculateCRC(byte[] data, int length) { ushort crc = 0xFFFF; for (int i = 0; i < length; i++) { crc ^= data[i]; for (int j = 0; j < 8; j++) { if ((crc & 0x0001) != 0) { crc >>= 1; crc ^= 0xA001; } else { crc >>= 1; } } } return crc; } } } ``` 这个示例代码演示了如何使用 C# 的 SerialPort 类与 ATEQ 设备进行通信。在 ReadHoldingRegisters 方法中,我们使用 MODBUS RTU 协议读取 ATEQ 设备的保持寄存器。 注意,此代码仅作为示例。在实际应用中,您需要根据 ATEQ 设备的手册编写适当的代码以满足您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值