C SerialPort 讀寫三菱FX系列PLC

2021-08-22 06:17:49 字數 2797 閱讀 2953

1:串列埠初始化  

com = new serialport("com3", 9600, parity.even, 7, stopbits.one);

2:開啟關閉串列埠

if (com.isopen)

com.open();

3:c# ascii轉字元及字元轉ascii

public static string chr(int asciicode)

;string strcharacter = asciiencoding.getstring(bytearray);//轉為字元

return (strcharacter);

}else

public static int asc(string character)

else

4:寫入串列埠的命令字串的和校驗

public string sumcheck(string data)

string res = sum.tostring("x");

res = res.substring(res.length - 2, 2);

return res;

5:寫入plc

private void btnwrite_click(object sender, eventargs e)

string write = new string ; //將準備寫入plc的值

//將要寫入的值轉換成16進製制數,補齊兩個位元組,注意高低位元組需要交換

string swritedata = "";

for (int i = 0; i < write.length; i++)

swritedata += s.substring(2,2)+s.substring(0,2);

}messagebox.show(swritedata);

//寫入命令,1表示寫入,1194表示d202這個位址的16進製制,04表示d202,d203為4個byte,1194=(202*2)+4096的16進製制數,至於用它表示d202的起始位置,三菱故意要這麼麻煩了

swritedata = "1119404" + swritedata + chr(3);

//chr(2)和chr(3)是構成命令的標誌字元,然後加上校驗和,命令組織完成

swritedata = chr(2) + swritedata + sumcheck(swritedata);

messagebox.show(swritedata);

//寫入串列埠

com.write(swritedata);

//byte data = encoding.ascii.getbytes(swritedata); 

6:讀plc

private void btnread_click(object sender, eventargs e)

}由於沒有暫存器型別資訊,所以位址的計算十分關鍵,如d100和m100分別對應哪個位址呢?下面就是三菱fx系列plc位址對應表:

public const plc_d_base_address = 4096

public const plc_d_special_base_address = 3584

public const plc_y_group_base_address = 160

public const plc_py_group_base_address = 672

public const plc_t_group_base_address = 192

public const plc_ot_group_base_address = 704

public const plc_rt_group_base_address = 1216

public const plc_m_single_base_address = 2048(命令為7或8時)

public const plc_m_group_base_address = 256

public const plc_pm_group_base_address = 768

public const plc_s_group_base_address = 0

public const plc_x_group_base_address = 128

public const plc_c_group_base_address = 448

public const plc_oc_group_base_address = 960

public const plc_rc_group_base_address = 1472

public const plc_tv_group_base_address = 2048

public const plc_cv16_group_base_address = 2560

public const plc_cv32_group_base_address = 3072 

當我們用device read命令時,d100位址=100*2+4096;m100位址=100+256;不同的是d型別暫存器存放的是字,m暫存器存放的是位,同樣是讀兩個位元組,d100返回的就是plc中d100位址的值,m型別暫存器返回的是m100到m116的值。所以當我們用force on 命令時,m100暫存器位址=100+2048;

這也沒有什麼複雜的,不是嗎?可是三菱公司好像不甘於如此,force on/off命令中位址排列與device read/write不同,是低位在前高位在後。如y20,位址是0510h,**中4個位元組位址表示為:1005。(注意:y暫存器為八進位制,如y20 位址=16+1280=0510h) 

其實一點技術含量都沒有,就是拐了幾個彎,偏偏很多時候又不都告訴你,讓人浪費不少時間。

C SerialPort 讀寫三菱FX系列PLC

c serialport 讀寫三菱fx系列plc 1 串列埠初始化 com new serialport com3 9600,parity.even,7,stopbits.one 2 開啟關閉串列埠 if com.isopen com.open if com.isopen 3 c ascii轉字元及...

C SerialPort 讀寫三菱FX系列PLC

c serialport 讀寫三菱fx系列plc 1 串列埠初始化 com new serialport com3 9600,parity.even,7,stopbits.one 2 開啟關閉串列埠 if com.isopen com.open if com.isopen 3 c ascii轉字元及...

三菱Q系列讀寫資料

這兩天看了下三菱q系列的mc協議,網上沒找到類似的delphi 自己手寫乙份,以下是傳送讀指令的 貼出來,有用的朋友可以拿去看看,注 這份是qna的c24模組的幀3c相容的第四種格式的協議規範,時間關係,其他的格式沒寫,有需要的博友到通訊手冊裡找找就有了。procedure tform1.butto...