首页 > 其他分享 >上位机通过模块链接plc

上位机通过模块链接plc

时间:2022-10-20 18:11:52浏览次数:49  
标签:00 01 Convert AddRange 上位 地址 plc 模块 data

报文格式

读报文:01 03 E0 0D 00 01 AB CD

  01是设备地址默认都是01;03是功能码,参考modbus功能码;E0 0D 是操作的PLC地址,是由10进制的PLC地址转换为16进制得到,此处对应的是57357;00 01对应的是读取长度;AB CD 是根据前面信息得到的校验码

C#上位机,代码开发,组建读取报文

List<byte> data = new List<byte>(255);
data.Add(Convert.ToByte(1));//路由
data.Add(Convert.ToByte(3));//功能码
data.AddRange(BitConverter.GetBytes((ushort)0).Reverse().ToArray());//地址
data.AddRange(BitConverter.GetBytes((ushort)1).Reverse().ToArray());//数量
byte[] dataBuff = CRC.ToModbusCRC16Byte(data.ToArray(), true);
data.AddRange(dataBuff);//校验码
return data.ToArray();

此处需要注意地址和数量的转换,因为C#里面的数字默认是32位int,需要转换为ushort,不然报文会多出几位

写单个寄存器报文:01 06 E0 0D 00 23 6E 10 

  01是设备地址默认都是01;06是功能码;E0 0D 是操作的PLC地址;00 23对应的是写入的数据;6E 10是根据前面信息得到的校验码

写多个寄存器报文:01 0F 00 00 00 02 04 00 01 00 02 23 AE

  01是设备地址,0;0F是功能码;00 00 是起始地址;00 02是寄存器数量;04是长度;001是第一个值;002是第二个值;23 AE是校验码

C#上位机,代码开发,组建报文

List<byte> data = new List<byte>(255);
data.Add(Convert.ToByte(route));//设备地址
data.Add(Convert.ToByte(fCode));//功能码
data.AddRange(StringUtils.DataConvertToBytes(add));//地址

if (fCode == 6 || fCode == 16)//寄存器一个数量=两个长度
{
data.AddRange(StringUtils.DataConvertToBytes((ushort)(len / 2)));//寄存器个数
data.Add(Convert.ToByte(len));//字节
}
else
{
data.AddRange(StringUtils.DataConvertToBytes(len)); //寄存器个数
data.Add(Convert.ToByte(Math.Ceiling(Convert.ToDecimal(len) / 8)));
}
byte[] b = new byte[data.Count + toValue.Length];
Array.Copy(data.ToArray(), 0, b, 0, data.Count);
Array.Copy(toValue, 0, b, data.Count, toValue.Length);
byte[] dataBuff = new byte[2];
dataBuff = CRC.ToModbusCRC16Byte(b, true);
data.AddRange(toValue);//数据
data.AddRange(dataBuff);//校验码
return data.ToArray();

 

标签:00,01,Convert,AddRange,上位,地址,plc,模块,data
From: https://www.cnblogs.com/ThisYbc/p/16810790.html

相关文章

  • os,sys,json模块
    目录os模块(重要)sys模块json模块json模块实战os模块(重要)os模块主要与代码运行所在的操作系统打交道importos1.创建目录(文件夹)ps:加上r是解决对文件路径并且撬棍跟一......
  • os模块
    目录os模块(重要)os模块简介创建目录os.mkdir()os.makedirs()删除目录os.rmdir()os.removedirs()列举指定路径下文件名称os.listdir()删除文件或重命名os.remove()os.renam......
  • 一种简单的视图层数据查询模块数据流--视图、路由、API
    背景简介实现前台项目的搜索页时,通常会将查询参数直接传给路由并显示在顶部的地址。params参数可以路径的一部分,因此可以理解;不过保留query的目的暂不清楚,对SSR模......
  • 【自然语言处理(NLP)】聊天机器人模块实现
    【自然语言处理(NLP)】聊天机器人模块实现作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源......
  • 【听如子说】-python模块系列-AIS编解码Pyais
    PyaisModuleIntroducepyais一个简单实用的ais编解码模块工作中需要和ais打交道,在摸鱼的过程中发现了一个牛逼的模块,对ais编解码感兴趣的可以拿项目学习一下,或者运用到......
  • 内置重要模块(os,json,sys)
    os模块  os模块主要与操作系统进行交互importos#1.创建目录mkdir/makedirsos.mkdir(r'a')os.mkdir(r'a\bb')os.mkdir(r'a\bb\ccc')mk......
  • os,json模块实现用户登录注册
    用户登录注册功能importosimportjson#注册功能#1.获取执行文件所在的目录路径base_dir=os.path.dirname(__file__)#D:/pythonProject03/day19#2.拼接......
  • 数据提取-lxml模块
    数据提取-lxml模块知识点了解lxml模块和xpath语法的关系了解lxml模块的使用场景了解lxml模块的安装了解谷歌浏览器xpathhelper插件的安装和使用掌握xpath语法......
  • 网络安全比赛A模块任务书
    前言这是作者这几个月来的第一次更新文章,问就是太忙了,最近要去参加国赛,在此重新回来写文章,也不知道能写多久,就当练习了。一.A模块基础设施设置/安全加固A-1.登录加固1......
  • Linux源码编译——添加新模块
    C源码文件(如new_module.c)添加到适当目录在menuconfig中增加新条目:修改C源码文件所在目录下的Kconfig文件,参考该文件中已有的编译选项照猫画虎,添加新的项configNEW_MOD......