public void BatchRead(BatchEntity entity)
{
List<byte> bytes = new List<byte>
{
0x50,0x00,
0x00,
0xFF,
0xFF,
0x03,
0x00,
0x0C,0x00, //数据长度
0x10,0x00,
0x01,0x04, //操作指令 批量读取
0x00,0x00 //子命令 字操作
};
//只有是位操作时才会修改 子命令
if (entity.IsBit)
{
bytes[13] = 0x01;
}
//地址处理 起始地址如果为3则需要转化为 00 00 03
List<byte> data = new List<byte>();
if (entity.Area == Area.X || entity.Area == Area.Y)
{
var address = entity.StartAddress!.PadLeft(6, '0');
for (int i = 0; i < 6; i += 2)
{
var str = address[i].ToString() + address[i + 1].ToString();
//转化为16进制的字节
data.Add(Convert.ToByte(str, 16));
}
//小端处理
data.Reverse();
}
else
{
int address = int.Parse(entity.StartAddress!);
data.Add((byte)(address % 256));
data.Add((byte)(address / 256 % 256));
data.Add((byte)(address / 256 / 256 % 256));
}
bytes.AddRange(data);
//添加软元件区
bytes.Add((byte)entity.Area);
//添加读取长度
ushort len = (ushort)entity.ReadLength;
bytes.Add(BitConverter.GetBytes(len)[0]);
bytes.Add(BitConverter.GetBytes(len)[1]);
//发送报文
socket.Send(bytes.ToArray());
}
/*************************BatchEntity 类********************************/
/// <summary>
/// 成批读取的实体
/// </summary>
public class BatchEntity
{
public Area Area { get; set; } //区域
public string? StartAddress { get; set; } //起始地址
public int ReadLength { get; set; } //读取长度
/// <summary>
/// 子命令(T为位操作 F为字操作)
/// </summary>
public bool IsBit { get; set; }
}
/***************************调用过程**********************************/
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("192.168.1.3", 6000);
//实例化库
MC3E mC = new MC3E(socket);
//读取Y2 的前四位
BatchEntity y = new BatchEntity
{
Area = Area.Y,
StartAddress = "0",
ReadLength = 4,
IsBit = true
};
//调用批量读取的方法 调用最上面的方法
mC.BatchRead(y);