三菱plc編程口的通訊協(xié)議比較簡單,只有四個命令,即:
命令 命令碼 目標設備
device read cmd 0 x,y,m,s,t,c,d
device write cmd 1 x,y,m,s,t,c,d
force on cmd 7 x,y,m,s,t,c
force off cmd 8 x,y,m,s,t,c五個標示:
enq 05h 請求
ack 06h plc正確響應
nak 15h plc錯誤響應
stx 02h 報文開始
etx 03h 報文結束
使用累加方式的和校驗,幀格式如下:
stx cmd data ...... data etx sum(upper) sum(lower)
和校驗:
sum= cmd+„„+etx。 如sum=73h,sum=“73”。
1、device read(讀出軟設備狀態(tài)值)
計算機向plc發(fā)送:
始命令 首地址 位數(shù) 終和校驗
stx cmd group address bytes etx sum plc 返回
stx 1st data 2nd data ..... last data etx sum
2、device write(向plc 軟設備寫入值)
計算機向plc發(fā)送:
始命令 首地址 位數(shù) 數(shù)據(jù) 終和校驗
plc 返回
ack (06h) 接受正確
nak (15h) 接受錯誤
3、位設備強制置位/復位
force on 置位
始命令 地址 終和校驗
stx cmd address etx sum 02h 37h address 03h sum force off 復位
始 命令 地址 終 和校驗 stx cmd address etx sum 02h 38h address 03h sum plc 返回
ack(06h) 接受正確
nak(15h) 接受錯誤
以上可以看出,協(xié)議非常簡單,但是由于沒有寄存器類型信息,所以地址的計算十分關鍵,如d100和m100分別對應哪個地址呢?下面就是三菱fx系列plc地址對應表:
public const plc_d_base_address = 4096 =1000h
public const plc_d_special_base_address = 3584 =e00h
public const plc_y_group_base_address = 160 =a0h
public const plc_py_group_base_address = 672 =2a0h
public const plc_t_group_base_address = 192 =c0h
public const plc_ot_group_base_address = 704 =2c0h
public const plc_rt_group_base_address = 1216 =4c0h
public const plc_m_single_base_address = 2048(命令為7或8時) =800h
public const plc_m_group_base_address = 256 =100h
public const plc_pm_group_base_address = 768 =300h
public const plc_s_group_base_address = 0 =0h
public const plc_x_group_base_address = 128 =80h
public const plc_c_group_base_address = 448 =1c0h
public const plc_oc_group_base_address = 960 =3c0h
public const plc_rc_group_base_address = 1472 =5c0h
public const plc_tv_group_base_address = 2048 =800h
public const plc_cv16_group_base_address = 2560 =a00h
public const plc_cv32_group_base_address = 3072 =c00h
當我們用device read命令時,d100地址=100*2+4096;m100地址=100+256;不同的是d類型寄存器存放的是字,m寄存器存放的是位,同樣是讀兩個字節(jié),d100返回的就是plc中d100地址的值,m類型寄存器返回的是m100到m116的值。所以當我們用force on 命令時,m100寄存器地址=100+2048;
這也沒有什么復雜的,不是嗎?可是三菱公司好像不甘于如此,force on/off命令中地址排列與device read/write不同,是低位在前高位在后。如y20,地址是0510h,代碼中4個字節(jié)地址表示為:1005。(注意:y寄存器為八進制,如y20地址=16+1280=0510h) 其實一點技術含量都沒有,就是拐了幾個彎,偏偏很多時候又不都告訴你,讓人浪費不少時間。不廢話了,自己做個程序試試吧。