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...