C#與三菱FX2NPLC的RS232接口通訊(Write)


Write的邏輯與上文Read設置相同,如有不清楚的請看上文C#與三菱FX2NPLCRS232接口通訊(Read),本文用於說明Write的功能

  1. 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交流學習


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM