Write的邏輯與上文Read設置相同,如有不清楚的請看上文C#與三菱FX2NPLC的RS232接口通訊(Read),本文用於說明Write的功能
- Write數據命令格式
02H 31H 起始地址 寫入長度N 數據1.....數據N 03H 校驗1 校驗2
02H 代表命令開始
31H 代表寫入命令
03H代表命令結束
起始地址計算方法:
ex: 讀D123,D124兩個點的數據
D123對應地址計算方法為:
123*2=246
246對應十六進制為F6H
Address=F6H+1000H=10F6H
故實際地址未 31H 30H 46H 36H
加入需要讀取D123,D124兩個地址,因為D的長度為2,所以讀取長度應該為2*2=4
故長度為 30H 34H
校驗計算方法為:
02H后到03H為止(包含03H)相加,然后取最后兩位得到校驗數據
如02H 31H 31H 30H 46H 36H 30H 34H 數據1 數據2 03H 校驗1 校驗2
命令每個數據由4個字節組成,格式為L1L2H1H2
假設數據1為124(D)數據2為35(D)
數據1 124(D)=7C(H)=007C(C)
命令為 37H 43H 30H 30H
數據2 35(D)=23(H)=0023(H)
命令為32H 33H 30H 30H
故實際命令如下
02H 31H 31H 30H 46H 36H 30H 34H 37H 43H 30H 30H 32H 33H 30H 30H 03H 校驗1 校驗2
校驗位=
31H+31H+30H+46H+36H+30H+34H+37H+43H+30H+30H+32H+33H+30H+30H+03H=314H
校驗1=31H 校驗2=34H
最終命令
02H 31H 31H 30H 46H 36H 30H 34H 30H 30H 37H 43H 30H 30H 32H 33H 03H 31H 34H
寫入成功后收到如下回復
查看實際數據
正確寫入
C#代碼為(配置等信息,請看上文Read部分,本文只展示寫入數據部分源代碼)
string[] datas = txtWriteData.Text.Split(',');
int length = Convert.ToInt32(txtLength.Text);
if (datas.Length < length)
{
MessageBox.Show("寫入數據長度與操作長度不匹配,請重新操作");
return;
}
int[] wdatas = datas.Select(t => Convert.ToInt32(t)).ToArray();
byte[] buffers = new byte[length * 4 + 11];
buffers[0] = 0x02;
buffers[1] = 0x31;//30讀,31寫
if (txtStartAddress.Text.StartsWith("D"))
{
int addSou = Convert.ToInt32(txtStartAddress.Text.Substring(1));
if (addSou > 9999 || addSou < 0)
{
MessageBox.Show("地址范圍為0-9999");
return;
}
addSou *= 2;
int addBase = 4096;//1000H對應10進制為4096
int startAdd = addBase + addSou;
string strAdd = startAdd.ToString("x8").TrimStart('0').ToUpper().PadLeft(4, '0');
buffers[2] = Convert.ToByte(strAdd[0]);
buffers[3] = Convert.ToByte(strAdd[1]);
buffers[4] = Convert.ToByte(strAdd[2]);
buffers[5] = Convert.ToByte(strAdd[3]);
}
string strLen = (length * 2).ToString("x8").TrimStart('0').ToUpper().PadLeft(2, '0');
buffers[6] = Convert.ToByte(strLen[0]);
buffers[7] = Convert.ToByte(strLen[1]);
for (int i = 0; i < length; i++)
{
string temp = wdatas[i].ToString("x8").TrimStart('0').ToUpper().PadLeft(4, '0');
//寫入數據的順序是34,12
buffers[i * 4 + 8] = Convert.ToByte(temp[2]);
buffers[i * 4 + 9] = Convert.ToByte(temp[3]);
buffers[i * 4 + 10] = Convert.ToByte(temp[0]);
buffers[i * 4 + 11] = Convert.ToByte(temp[1]);
}
buffers[buffers.Length - 3] = 0x03;
int total = 0;
for (int i = 1; i < buffers.Length - 2; i++)
{
total += Convert.ToInt32(buffers[i].ToString());
}
string cal = total.ToString("x8").TrimStart('0').ToUpper();
cal = cal.Substring(cal.Length - 2).PadLeft(2, '0');
buffers[buffers.Length - 2] = Convert.ToByte(cal[0]);
buffers[buffers.Length - 1] = Convert.ToByte(cal[1]);
sp.Write(buffers, 0, buffers.Length);
MessageBox.Show("寫入成功!");
以上為使用RS232協議C#讀寫三菱FX2NPLC的全部設置,如有不清楚的地方,可以添加QQ1319666784交流學習