blueskit / MitsubishiPlcProtocol

三菱PLC(Mitsubishi)通讯协议的C#实现,支持FX、Q系列的ASCII-3E、BIN-3E、FX串口格式。
MIT License
296 stars 153 forks source link

PLC程式問題 #5

Closed WeiChunKao closed 6 years ago

WeiChunKao commented 6 years ago

(一)為甚麼需在後面加上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)); }

blueskit commented 6 years ago

一、其实可以不使用“u”,这仅表示是一个无符号常量而已 二、三菱的PLC有很多通讯协议格式,例如这里的MC3E、MC4E,此外还分为ASCII格式、Binary格式。 所以需要按不同协议格式、组装或解析字节序列 组装时使用List便于持续追加后续内容,不必关心偏移量; 解析时使用Array,可以根据特定偏移量上的值,获取格式或其它信息

WeiChunKao commented 6 years ago

原來是這樣! 非常謝謝你!剛接觸這塊還有些地方不清楚

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 .

-- 高偉峻

WeiChunKao commented 6 years ago

你好! [image: 內置圖片 1] 想請問var dataLength=(uint)(iData.Length+6);這行的意思是代表甚麼? 還有 ret=new List(iData.Length+20);代表甚麼意思呢? [image: 內置圖片 2] 還有這兩個副程式目前還看不太懂! 如果可以的話可以麻煩你大概解釋一下嗎? 不好意思一直打擾你,非常謝謝你

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 .

-- 高偉峻