MODBUS RTU 写单个线圈
MODBUS RTU 写单个线圈
开关量写入和开关量采集
05(0x05)写单个线圈或单个离散输出
功能说明
用于将单个线圈寄存器(或离散输入)设置为ON或OFF,该功能码支持广播模式,在广播模式下,所有从站设备的同一地址的值将被统一修改,查询报文中的ON或OFF状态由报文数据字段的常熟指定,0xFF00表示ON状态,0x0000表示OFF状态。其他所有值均是非法的,并且对寄存器不起作用,将会返回异常相应。
查询报文
本功能码中,起始地址由2个字节构成,取值范围为0x0000~0xFFFF;变更目标数据由2个字节构成,取值只能为0xFF00或0x0000.
响应报文
对于从设备,在线圈或离散输出寄存器正常变更的情况下,则返回于查询报文一样的响应报文。如果修改失败,则返回一个异常响应。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.IO.Ports;
using System.Threading;namespace ReadRegister
{internal class Program{static void Main(string[] args){// 字节数组转字符串byte[] vals = { 0x01, 0xAA ,0x02};string strr = BitConverter.ToString(vals);Console.WriteLine(strr); //结果01-AA-02string st1 = BitConverter.ToString(vals).Replace("-", "");Console.WriteLine(st1);//结果01AA02SerialPort serialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);if (!serialPort.IsOpen){serialPort.Open();}string str = "FE 05 00 00 00 00 D9 C5";string[] arr = str.Split(' ');List<byte> command = new List<byte>();byte[] b = new byte[arr.Length];for (int i = 0; i < arr.Length; i++){// arr[i] = "0x" + arr[i];b[i] = Convert.ToByte(arr[i], 16);}command.AddRange(b);/*//拼接报文ushort startAddr = 0;ushort readLen = 1;List command = new List();command.Add(0xFE);//从站地址command.Add(0x05);//功能码command.Add(BitConverter.GetBytes(startAddr)[1]);//开始地址command.Add(BitConverter.GetBytes(startAddr)[0]);// command.Add(BitConverter.GetBytes(readLen)[1]);//读取长度//command.Add(BitConverter.GetBytes(readLen)[0]);command.Add(0xFF);command.Add(0x00);command.Add(0x98);command.Add(0x35);//crc// byte[] crc = CalculateCRC(command.ToArray(), command.Count);// command.AddRange(crc);//连接串口*/ //发送serialPort.Write(command.ToArray(), 0, command.Count);//接收Thread.Sleep(50);int lengh = serialPort.BytesToRead;byte[] buffer = new byte[lengh];serialPort.Read(buffer, 0, lengh);//接收到字节数组数据 转字符串打印Console.WriteLine(BitConverter.ToString(buffer)); //FE - 05 - 00 - 00 - 00 - 00 - D9 - C5//byte[] result = new byte[buffer.Length];//Array.Copy(buffer, 3, result, 0, buffer.Length);string getstr = byteToHexStr(buffer);Console.WriteLine(getstr); //FE0500000000D9C5//Console.WriteLine((result[0] * 256 + result[1]).ToString());Console.ReadKey();}public static string byteToHexStr(byte[] bytes){string returnStr = "";if (bytes != null){for (int i = 0; i < bytes.Length; i++){returnStr += bytes[i].ToString("X2");//ToString("X2") 只是以16进制格式化 不显示0x ,X是十六进制,2是两位格式不足高位补零}}return returnStr;}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
