通過以太網為控制器擴展IO數量、擴展模擬量輸出、擴展模擬量輸入。
深圳市一天廣聯(lián)科技有限公司
一、 概述
AiMaker、AiMaster產品可以通過自身以太網網口來連接并控制遠程IO模塊、遠程模擬量輸出模塊、遠程模擬量輸入模塊等各類兼容的模塊。
模塊擴展功能通過100Mpbs以太網實現,通訊速度比傳統(tǒng)PLC擴展方式要快10至100倍。在可連接模塊數量上也遠超傳統(tǒng)的PLC方案。
本方案采用標準的Modbus TCP協(xié)議作為擴展協(xié)議,*使用以太網和TCP/IP方式進行通訊,并且可以跨網段通訊。
在使用網線連接時,主機與擴展模塊之間的距離可以達到100米。在使用以太網光纖通訊時,兩者穩(wěn)定通訊距離可達幾十公里。如果可以容忍較大的通訊延遲,也可以使用WiFi、手機網、電力貓等等各類線路進行擴展。
目前所有的擴展模塊均為多網口設計,多個擴展模塊可以通過以太網手拉手分支、級聯(lián),實現自組以太網,無需單獨購買交換機。
每個控制器最多可驅動8個IO模塊、8個模擬量輸出模塊、8個模擬量采集模塊,對模塊的通道數量沒有限制。
兼容的遠程IO模塊:GL-IO4(4路IO),GL-IO8(8路IO),GL-IO32(32路IO)
兼容的遠程模擬量輸出模塊:GL-DAC3,3路模擬量輸出產品。此模塊有4個型號,分別支持0至20mA輸出,0至10v輸出,0至5V輸出,PWM輸出。
兼容的遠程模擬量采集模塊:GL-EXT600,同時支持8路模擬量采集和8路IO,此模塊有3個型號,分別支持0至20mA采集,0至10v采集,0至5V采集。
本文的示例代碼均可在免費編程軟件xframe中查看運行。單擊下載xframe編程軟件
二、 示例連接圖
下圖演示了,為一臺AiMaker600擴展1個3路模擬量輸出模塊、1個8路開關量輸入/輸出模塊的連接方式。
將以此圖為例子,分別描述控制模擬量輸出、控制IO的方法。
三、 控制器模塊擴展服務描述
1、 TCP/IP連接方式
控制器與擴展模塊之間采用TCP/IP協(xié)議通訊,控制器作為Client連接至Server模式的擴展模塊。擴展通訊協(xié)議為Modbus TCP。使用502通訊端口。
2、 模塊擴展函數庫
extdac:擴展模擬量輸出函數庫
extdio:擴展IO函數庫
extadc:擴展模擬量采集函數庫
3、 啟動擴展模塊服務函數
啟動擴展模擬量輸出服務:extdac.startextdac(0,"192.168.192.252",502,20,5000,15);
啟動擴展IO模塊服務:extdio.startextdio(0,"192.168.192.252",502,20,5000,15);
啟動擴展模擬量采集模塊服務:extadc.startextadc(0,"192.168.192.252",502,20,5000,15);
啟動擴展模塊服務函數在整個程序中,只需調用一次即可。
4、 使用方法
使用方法非常簡單,以控制遠程IO模塊繼電器輸出為例子進行簡要說明
下行代碼startextdio啟動擴展遠程IO服務啟動,遠程IO的IP為192.168.192.102,端口為502。
extdio.startextdio(0,"192.168.192.102",502,20,5000,15);
正確啟動服務后,即可調用繼電器控制函數,無需其他操作了。
seton設置遠程IO模塊的第1路繼電器為接通
extdio.seton(0,0)
setoff設置遠程IO模塊的第1路繼電器為斷開
extdio.setoff(0,0)
更詳細例子請參考下面的說明
5、 可靠性
控制器模塊擴展服務可以自動連接擴展模塊,并且可以自動檢測與擴展模塊的通訊情況,如果檢測出與擴展模塊通訊中斷,將會自動的不斷嘗試重連,直到成功連接模塊。整個過程是全自動的,無需用戶干預。
四、 控制遠程模擬量輸出例子。
1、 控制4至20mA模擬量輸出
print("演示連接遠程DAC模塊,并進行控制,本例子測試的是0~20mA輸出。")
--startextdac啟動擴展遠程模擬量輸出服務
--參數1:服務索引,有效值為0~7,可同時支持控制8個遠程DAC輸出模塊。
--參數2:遠程ip,為遠程IO模塊的IP地址
--參數3:遠程端口,為遠程IO模塊的Modbus TCP協(xié)議端口。
--參數4:接收超時,為秒值,達到此超時未能收到遠程模塊返回數據,將判定此連接故障
--后臺服務將斷開此連接,并在等待“重試連接間隔"后,重新嘗試連接遠程IO模塊。
--參數5:重試連接間隔,為毫秒值。
--參數6:保持連接的周期,為秒值,后臺服務將以此間隔不斷的向遠程DAC模塊發(fā)送報文,以測試通訊線路是否正常。
--此參數為秒,應小于遠程DAC模塊的TCP/IP接收超時參數。
extdac.startextdac(0,"192.168.192.101",502,20,5000,15);
local setvalue=0.0
while(true) do
--setdac420ma設置擴展模擬量輸出0至20mA值
--參數1:擴展遠程模擬量輸出服務索引,此索引應由startextdac函數啟動后方可使用。
--參數2:設置的模擬量輸出值,有效值為0至20。
--參數3:的模擬量輸出通道,為0起,0為個模擬量輸出通道。
--返回:成功返回大于0的值,否則為失敗
--循環(huán)設置遠程DAC模塊的通道1輸出0~20mA電流,每次增加1mA。
res=extdac.setdac420ma(0,setvalue,0)
print(string.format("
setdac420ma 執(zhí)行結果%d", res));
setvalue=setvalue+1
if setvalue>20.0 then
setvalue=0
end
syslib.ossleep(2000);
end
end
2、 控制0至10V模擬量輸出
print("演示連接遠程DAC模塊,并進行控制,本例子測試的是0~10V輸出。")
--startextdac啟動擴展遠程模擬量輸出服務
--參數1:服務索引,有效值為0~7,可同時支持控制8個遠程DAC輸出模塊。
--參數2:遠程ip,為遠程IO模塊的IP地址
--參數3:遠程端口,為遠程IO模塊的Modbus TCP協(xié)議端口。
--參數4:接收超時,為秒值,達到此超時未能收到遠程模塊返回數據,將判定此連接故障
--后臺服務將斷開此連接,并在等待“重試連接間隔"后,重新嘗試連接遠程IO模塊。
--參數5:重試連接間隔,為毫秒值。
--參數6:保持連接的周期,為秒值,后臺服務將以此間隔不斷的向遠程DAC模塊發(fā)送報文,以測試通訊線路是否正常。
--此參數為秒,應小于遠程DAC模塊的TCP/IP接收超時參數。
extdac.startextdac(0,"192.168.192.101",502,20,5000,15);
local setvalue=0.0
while(true) do
--setdac010v設置擴展模擬量輸出0至10V值
--參數1:擴展遠程模擬量輸出服務索引,此索引應由startextdac函數啟動后方可使用。
--參數2:設置的模擬量輸出值,有效值為0至10。
--參數3:的模擬量輸出通道,為0起,0為個模擬量輸出通道。
--返回:成功返回大于0的值,否則為失敗
--循環(huán)設置遠程DAC模塊的通道1輸出0~10v電壓,每次增加1v。
res=extdac.setdac010v(0,setvalue,0)
print(string.format("
setdac010v 執(zhí)行結果%d", res));
setvalue=setvalue+1
if setvalue>10.0 then
setvalue=0
end
syslib.ossleep(2000);
end
3、 讀取模擬量輸出值
print("演示連接遠程DAC模塊,設置0~20mA輸出值,并回讀輸出值。")
--startextdac啟動擴展遠程模擬量輸出服務
--參數1:服務索引,有效值為0~7,可同時支持控制8個遠程DAC輸出模塊。
--參數2:遠程ip,為遠程IO模塊的IP地址
--參數3:遠程端口,為遠程IO模塊的Modbus TCP協(xié)議端口。
--參數4:接收超時,為秒值,達到此超時未能收到遠程模塊返回數據,將判定此連接故障
--后臺服務將斷開此連接,并在等待“重試連接間隔"后,重新嘗試連接遠程IO模塊。
--參數5:重試連接間隔,為毫秒值。
--參數6:保持連接的周期,為秒值,后臺服務將以此間隔不斷的向遠程DAC模塊發(fā)送報文,以測試通訊線路是否正常。
--此參數為秒,應小于遠程DAC模塊的TCP/IP接收超時參數。
extdac.startextdac(0,"192.168.192.101",502,20,5000,15);
local setvalue=0.0
while(true) do
--setdac420ma設置擴展模擬量輸出0至20mA值
res=extdac.setdac420ma(0,setvalue,0)
print(string.format("
setdac420ma 執(zhí)行結果%d", res));
setvalue=setvalue+1
if setvalue>20.0 then
setvalue=0
end
--readdac420ma讀取遠程DAC模塊0~20mA輸出通道的當前值
--參數1:擴展遠程模擬量輸出服務索引,此索引應由startextdac函數啟動后方可使用。
--參數2:讀取的0~20mA模擬量輸出的通道號,為0起,0讀取路模擬量輸出通道。
--返回:返回1:成功返回大于0,否則失敗,返回2:當前模擬量輸出的值,為浮點數。
res,dacoutvalue=extdac.readdac420ma(0,0)
if res>0 then
print(string.format("
readdac420ma 執(zhí)行結果:%d,通道值:%2.2f",res,dacoutvalue));
end
syslib.ossleep(2000);
end
四、 控制遠程IO的例子。
1、控制遠程IO的繼電器輸出
print("演示通過以太網控制遠程IO模塊的1路開關量輸出")
--startextdio啟動擴展遠程IO服務
--參數1:服務索引,有效值為0~7,可同時支持控制8個遠程IO模塊。
--參數2:遠程ip,為遠程IO模塊的IP地址
--參數3:遠程端口,為遠程IO模塊的Modbus TCP協(xié)議端口。
--參數4:接收超時,為秒值,達到此超時未能收到遠程模塊返回數據,將判定此連接故障
--后臺服務將斷開此連接,并在等待“重試連接間隔"后,重新嘗試連接遠程IO模塊。
--參數5:重試連接間隔,為毫秒值。
--參數6:保持連接的周期,為秒值,后臺服務將以此間隔不斷的向遠程IO模塊發(fā)送報文,以測試通訊線路是否正常。
--此參數為秒,應小于遠程IO模塊的TCP/IP接收超時參數。
extdio.startextdio(0,"192.168.192.102",502,20,5000,15);
while(true) do
--seton設置遠程IO通道為接通
--參數1:擴展遠程IO服務索引
--參數2:設置的通道,為0起,0為第1路輸出通道。
--返回:成功返回大于0的值,否則為失敗
res=extdio.seton(0,0)
print(string.format("
設置擴展IO通道1為接通的執(zhí)行結果%d", res));
syslib.ossleep(1000);
--setoff設置遠程IO通道為斷開
--參數1:擴展遠程IO服務索引
--參數2:設置的通道,為0起,0為第1路輸出通道。
--返回:成功返回大于0的值,否則為失敗
res=extdio.setoff(0,0)
print(string.format("
設置遠程IO通道1為斷開的執(zhí)行結果 %d", res));
syslib.ossleep(1000);
end
2、讀取遠程IO開關量輸入狀態(tài)
print("演示通過以太網讀取遠程IO模塊的1路開關量輸入狀態(tài)")
--startextdio啟動擴展遠程IO服務
--參數1:服務索引,有效值為0~7,可同時支持控制8個遠程IO模塊。
--參數2:遠程ip,為遠程IO模塊的IP地址
--參數3:遠程端口,為遠程IO模塊的Modbus TCP協(xié)議端口。
--參數4:接收超時,為秒值,達到此超時未能收到遠程模塊返回數據,將判定此連接故障
--后臺服務將斷開此連接,并在等待“重試連接間隔"后,重新嘗試連接遠程IO模塊。
--參數5:重試連接間隔,為毫秒值。
--參數6:保持連接的周期,為秒值,后臺服務將以此間隔不斷的向遠程IO模塊發(fā)送報文,以測試通訊線路是否正常。
--此參數為秒,應小于遠程IO模塊的TCP/IP接收超時參數。
extdio.startextdio(0,"192.168.192.102",502,20,5000,15);
while(true) do
--get1ich讀取遠程IO模塊開關量輸入通道的狀態(tài)
--參數1:擴展遠程IO服務索引,此索引應由startextdio函數啟動后方可使用。
--參數2:讀取的開關量輸入通道,為0起,0為讀取第1路開關量輸入通道
--返回:參數1,成功返回大于0的值,否則為失敗,參數2為開關量輸入狀態(tài)值,0為斷開,1為接通
res,distate=extdio.get1in(0,0)
if (res>0) then
print(string.format("
開關量輸入1狀態(tài):%d", distate));
end
syslib.ossleep(1000);
end
2、一次讀取全部遠程IO開關量輸入狀態(tài)
print("演示通過以太網讀取遠程IO模塊全部開關量輸入通道狀態(tài)")
local alldi={}
--startextdio啟動擴展遠程IO服務
--參數1:服務索引,有效值為0~7,可同時支持控制8個遠程IO模塊。
--參數2:遠程ip,為遠程IO模塊的IP地址
--參數3:遠程端口,為遠程IO模塊的Modbus TCP協(xié)議端口。
--參數4:接收超時,為秒值,達到此超時未能收到遠程模塊返回數據,將判定此連接故障
--后臺服務將斷開此連接,并在等待“重試連接間隔"后,重新嘗試連接遠程IO模塊。
--參數5:重試連接間隔,為毫秒值。
--參數6:保持連接的周期,為秒值,后臺服務將以此間隔不斷的向遠程IO模塊發(fā)送報文,以測試通訊線路是否正常。
--此參數為秒,應小于遠程IO模塊的TCP/IP接收超時參數。
extdio.startextdio(0,"192.168.192.102",502,20,5000,15);
while(true) do
alldi={}
--getallin讀取遠程IO模塊全部輸入通道狀態(tài)
--參數1:擴展遠程IO服務索引,此索引應由startextdio函數啟動后方可使用。
--參數2:讀取的開關量輸入通道數量。例如設置為4,讀取全部4路輸入通道的狀態(tài)。
--參數3:開關量輸入狀態(tài)數據輸出數組,每個數組元素的8個bit表示8路開關量輸入狀態(tài)。
--bit狀態(tài)為0說明開關量輸入斷開,1為接通。
--例如,數組[1]的值表示第開關量輸入1~8輸入狀態(tài),數組[2]表示9~16開關量輸入狀態(tài)。
--返回:成功返回大于0的值,否則為失敗
res=extdio.getallin(0,4,alldi)
if (res>0) then
debug.printarray(alldi);
end
syslib.ossleep(1000);
end
五、 讀取遠程模擬量采集模塊通道值
print("演示連接遠程模擬量采集模塊,讀取0~20mA模擬量輸入值。")
--startextadc啟動擴展遠程模擬量采集服務
--參數1:服務索引,有效值為0~7,可同時支持讀取8個遠程模擬量采集模塊數據。
--參數2:遠程ip,為遠程IO模塊的IP地址
--參數3:遠程端口,為遠程IO模塊的Modbus TCP協(xié)議端口。
--參數4:接收超時,為秒值,達到此超時未能收到遠程模塊返回數據,將判定此連接故障
--后臺服務將斷開此連接,并在等待“重試連接間隔"后,重新嘗試連接遠程IO模塊。
--參數5:重試連接間隔,為毫秒值。
--參數6:保持連接的周期,為秒值,后臺服務將以此間隔不斷的向遠程模擬量采集模塊發(fā)送報文,以測試通訊線路是否正常。
--此參數為秒,應小于遠程模擬采集模塊的TCP/IP接收超時參數。
extadc.startextadc(0,"192.168.192.101",502,20,5000,15);
local extadcval=0.0
while(true) do
--readadc420ma讀取遠程模塊0~20mA輸入通道值
--參數1:擴展遠程模擬量輸入服務索引,此索引應由startextadc函數啟動后方可使用。
--參數2:讀取的0~20mA模擬量輸入的通道號,為0起,0讀取路模擬量輸入通道。
--返回:返回1:成功返回大于0,否則失敗,返回2:當前模擬量輸入的值,為浮點數,單位為mA。
res,extadcval=extadc.readadc420ma(0,0)
if res>0 then
print(string.format("
readadc420ma 執(zhí)行結果:%d,通道值:%2.2f",res,extadcval));
else
print(string.format("
readadc420ma 執(zhí)行失敗:%d",res));
end
syslib.ossleep(2000);
end