Closed WeiChunKao closed 6 years ago
一、其实可以不使用“u”,这仅表示是一个无符号常量而已
二、三菱的PLC有很多通讯协议格式,例如这里的MC3E、MC4E,此外还分为ASCII格式、Binary格式。
所以需要按不同协议格式、组装或解析字节序列
组装时使用List
原來是這樣! 非常謝謝你!剛接觸這塊還有些地方不清楚
domino notifications@github.com於 2018年2月22日 週四,21:31寫道:
一、其实可以不使用“u”,这仅表示是一个无符号常量而已 二、三菱的PLC有很多通讯协议格式,例如这里的MC3E、MC4E,此外还分为ASCII格式、Binary格式。 所以需要按不同协议格式、组装或解析字节序列 组装时使用List便于持续追加后续内容,不必关心偏移量; 解析时使用Array,可以根据特定偏移量上的值,获取格式或其它信息
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/blueskit/MitsubishiPlcProtocol/issues/5#issuecomment-367681251, or mute the thread https://github.com/notifications/unsubscribe-auth/AhW9Bu-rwcI1wVqNW3xIwSE7INvj30NBks5tXWw3gaJpZM4SOlqR .
-- 高偉峻
你好!
[image: 內置圖片 1]
想請問var dataLength=(uint)(iData.Length+6);這行的意思是代表甚麼?
還有 ret=new List
2018-02-22 21:35 GMT+08:00 Mycar Kao kivenkao@gmail.com:
原來是這樣! 非常謝謝你!剛接觸這塊還有些地方不清楚
domino notifications@github.com於 2018年2月22日 週四,21:31寫道:
一、其实可以不使用“u”,这仅表示是一个无符号常量而已 二、三菱的PLC有很多通讯协议格式,例如这里的MC3E、MC4E,此外还分为ASCII格式、Binary格式。 所以需要按不同协议格式、组装或解析字节序列 组装时使用List便于持续追加后续内容,不必关心偏移量; 解析时使用Array,可以根据特定偏移量上的值,获取格式或其它信息
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/blueskit/MitsubishiPlcProtocol/issues/5#issuecomment-367681251, or mute the thread https://github.com/notifications/unsubscribe-auth/AhW9Bu-rwcI1wVqNW3xIwSE7INvj30NBks5tXWw3gaJpZM4SOlqR .
-- 高偉峻
(一)為甚麼需在後面加上u呢? public McCommand(McFrame iFrame) { FrameType = iFrame; SerialNumber = 0x0001u; NetwrokNumber = 0x0000u; PcNumber = 0x00FFu; IoNumber = 0x03FFu; ChannelNumber = 0x0000u; CpuTimer = 0x0010u; } (二)想請問以下程式碼是以甚麼想法或概念寫的? public byte[] SetCommand(uint iMainCommand, uint iSubCommand, byte[] iData) { var dataLength = (uint)(iData.Length + 6); var ret = new List(iData.Length + 20);
uint frame = (FrameType == McFrame.MC3E) ? 0x0050u :
(FrameType == McFrame.MC4E) ? 0x0054u : 0x0000u;
ret.Add((byte)frame);
ret.Add((byte)(frame >> 8));
if (FrameType == McFrame.MC4E)
{
ret.Add((byte)SerialNumber);
ret.Add((byte)(SerialNumber >> 8));
ret.Add(0x00);
ret.Add(0x00);
}
ret.Add((byte)NetwrokNumber);
ret.Add((byte)PcNumber);
ret.Add((byte)IoNumber);
ret.Add((byte)(IoNumber >> 8));
ret.Add((byte)ChannelNumber);
ret.Add((byte)dataLength);
ret.Add((byte)(dataLength >> 8));
ret.Add((byte)CpuTimer);
ret.Add((byte)(CpuTimer >> 8));
ret.Add((byte)iMainCommand);
ret.Add((byte)(iMainCommand >> 8));
ret.Add((byte)iSubCommand);
ret.Add((byte)(iSubCommand >> 8));
ret.AddRange(iData);
return ret.ToArray();
}
public int SetResponse(byte[] iResponse)
{
int min = (FrameType == McFrame.MC3E) ? 11 : 15;
if (min <= iResponse.Length)
{
var btCount = new[] { iResponse[min - 4], iResponse[min - 3] };
var btCode = new[] { iResponse[min - 2], iResponse[min - 1] };
int rsCount = BitConverter.ToUInt16(btCount, 0);
ResultCode = BitConverter.ToUInt16(btCode, 0);
Response = new byte[rsCount - 2];
Buffer.BlockCopy(iResponse, min, Response, 0, Response.Length);
}
return ResultCode;
}
// ================================================================================
public bool IsIncorrectResponse(byte[] iResponse)
{
var min = (FrameType == McFrame.MC3E) ? 11 : 15;
var btCount = new[] { iResponse[min - 4], iResponse[min - 3] };
var btCode = new[] { iResponse[min - 2], iResponse[min - 1] };
var rsCount = BitConverter.ToUInt16(btCount, 0) - 2;
var rsCode = BitConverter.ToUInt16(btCode, 0);
return (rsCode == 0 && rsCount != (iResponse.Length - min));
}