PLC 工控機 嵌入式系統(tǒng) 人機界面 工業(yè)以太網(wǎng) 現(xiàn)場總線 變頻器 機器視覺 DCS PAC/PLMC SCADA 工業(yè)軟件 ICS信息安全 應用方案 無線通訊
深圳市一天廣聯(lián)科技有限公司
參 考 價 | 面議 |
產(chǎn)品型號
品 牌
廠商性質(zhì)其他
所 在 地
聯(lián)系方式:白工查看聯(lián)系方式
更新時間:2022-12-27 13:49:34瀏覽次數(shù):467次
聯(lián)系我時,請告知來自 智能制造網(wǎng)產(chǎn)品名稱: 國網(wǎng)DL645-2007電表規(guī)約轉(zhuǎn)Modbus方案 規(guī) 格: 產(chǎn)品備注: 產(chǎn)品類別:DL645-2007協(xié)議轉(zhuǎn)Modbus方案......
1、概述
DL645協(xié)議是智能電表常用的通訊協(xié)議。此協(xié)議規(guī)定了非常多的數(shù)據(jù)點,但是目前的智能電表通常只支持幾個常用數(shù)據(jù)點,而且所支持數(shù)據(jù)點并無統(tǒng)一標準。為協(xié)議處理和轉(zhuǎn)換造成了比較大的難度。
我公司的AiMaster、AiMaker系列可編程產(chǎn)品內(nèi)置了DL645-2007處理算法。通過Lua函數(shù)調(diào)用DL645庫接口函數(shù),這樣可以根據(jù)不同的電表,靈活進行數(shù)據(jù)處理。
在取得DL645數(shù)據(jù)后,就可以放入Modbus虛擬機的Modbus寄存器,提供給多個上位機同時讀取。無需編寫任何Modbus通訊代碼。如果使用AiMaker600物聯(lián)網(wǎng)PLC,還可以根據(jù)取得的數(shù)據(jù)做出控制動作。
AiMaster、AiMaker產(chǎn)品也可以對取得DL645數(shù)據(jù),使用算法做進一步運算處理,也可以傳輸至云端,提供給APP讀取。
2、讀取電能數(shù)據(jù)
此例子讀取總電量數(shù)據(jù),所有電表都支持此功能。電表是否支持規(guī)約中的其他電能數(shù)據(jù),請咨詢電表廠家。
print("讀取DL645正向有功總電能數(shù)據(jù)。")
--表號
local saddr={20,19,01,01,50,02}
--標識碼,此標識碼為DL645-2007協(xié)議所規(guī)定的電能數(shù)據(jù)標識碼
--格式為BCD碼,可以直接套用協(xié)議中的標識碼規(guī)定
--為
local idcode={0x00,0x01,0x00,0x00}
--電表應答的原始數(shù)據(jù)
local rawdata={0}
local res=0.0
while (true) do
rawdata={0}
--readpwvalue讀取電能數(shù)據(jù)函數(shù)
--參數(shù)1:串口號,為0起,0為串口1,1為串口2,以此類推
--參數(shù)2:6個數(shù)字的表號,通常在電表上可以找到表號,直接填入即可,表號為BCD數(shù)字格式。
--參數(shù)3:為數(shù)組格式的標識碼,用于指出要讀取的電能數(shù)據(jù),應符合DL645-2007的定義,
--例如:為讀取正向有功總電能,為讀取反向有功總電能。
--參數(shù)4:接收到的原始數(shù)據(jù)數(shù)組,從電表收到的原始數(shù)據(jù),如果讀取錯誤,此數(shù)據(jù)無效。
--參數(shù)5:通訊超時,發(fā)送讀取指令后,等待電表應答的超時,如果達到超時而未收到電表
--應答數(shù)據(jù),則認為電表無應答,將返回錯誤。
--返回:如果返回數(shù)據(jù)為nil說明讀取失敗。否則返回讀取到的電能數(shù)據(jù)值,為帶2位小數(shù)的浮點數(shù)。
res=dl645.readpwvalue(2,saddr,idcode,rawdata,1000)
if (res==nil) then
print(string.format("
讀取失敗"));
else
--res為浮點數(shù)格式的總電量數(shù)據(jù)
print(string.format("
res:%6.2f",res));
end
debug.printarray(rawdata);
--setvaluefc3函數(shù),將電能數(shù)據(jù)值,設置進Modbus寄存器值
--參數(shù)1:Modbus寄存器地址,2個地址保存4個字節(jié)
--參數(shù)2:下位機地址碼
--參數(shù)3:數(shù)據(jù)類型2-ushort,3-long,4-float,5-int,6-short;
--參數(shù)4:此Modbus寄存器地址的數(shù)據(jù)
--相同類型的數(shù)據(jù),應組織在各自的連續(xù)的寄存器地址,不應混和組合.
--數(shù)據(jù)類型為u_short,u_short為16bit數(shù)據(jù),占用1個寄存器地址,寄存器讀取數(shù)量為1
--設置進Modbus寄存器提供給上位機讀取。
--對應的Modbus參數(shù)為,下位機地址1,寄存器地址0起,讀取2個寄存器,格式為反轉(zhuǎn)float
lib_vmb.setvaluefc3(0,1,4,res);
syslib.ossleep(1000);
end
3、讀取變量數(shù)據(jù)
并不是所有電表都支持此例子所讀取的變量數(shù)據(jù),請咨詢電表廠家以獲得更多信息。
print("讀取DL645變量數(shù)據(jù)。")
--啟用發(fā)送前導字符4個0xFE
--setopt函數(shù)設置DL645庫的全局參數(shù)。
--參數(shù)1:為選項編號,1-是否啟用發(fā)送前導字符4個0xFE
--參數(shù)2:為選項數(shù)據(jù),1-發(fā)送(默認),0-不發(fā)送前導字符
--dl645.setopt(1,1)
while (true) do
--表號
local saddr={20,19,01,01,50,02}
--idcode為16進制格式的4字節(jié)標識碼
--字節(jié)存儲順序,按照DL645-2007協(xié)議規(guī)定的DI3、DI2、DI1、DI0順序排列。
--idcode數(shù)組的第1個字節(jié)是DI3。以此類推。
--第1個字節(jié)0x02為讀取變量數(shù)據(jù),第2個字節(jié)0x01是讀取電壓
--第3個字節(jié)0x01為讀取A相電壓,第3個字節(jié)未用,設置為0.
--讀取其他變量數(shù)據(jù)的標識碼,請查閱DL645-2007協(xié)議手冊?;騾⒖?常用DL645數(shù)據(jù)轉(zhuǎn)Modbus"例程
local idcode={0x02,0x01,0x01,0x00}
--rawdata用于存儲電表應答的原始數(shù)據(jù)
local rawdata={0}
--res為讀取到的數(shù)據(jù)。
local res=0.0
--readvaldata讀取變量數(shù)據(jù)函數(shù)
--參數(shù)1:串口號,為0起,0為串口1,1為串口2,以此類推
--參數(shù)2:6個數(shù)字的表號,通常在電表上可以找到表號,直接填入即可,表號為BCD數(shù)字格式。
--參數(shù)3:為數(shù)組格式的標識碼,用于指出要讀取的電能數(shù)據(jù),應符合DL645-2007,1997的定義,
--例如:為讀取A相電壓
--參數(shù)4:接收到的原始數(shù)據(jù)數(shù)組,從電表收到的原始數(shù)據(jù),如果讀取錯誤,此數(shù)據(jù)無效。
--參數(shù)5:通訊超時,發(fā)送讀取指令后,等待電表應答的超時,如果達到超時而未收到電表
--應答數(shù)據(jù),則認為電表無應答,將返回錯誤。
--返回:如果返回數(shù)據(jù)為nil說明讀取失敗。
--否則返回讀取到的數(shù)據(jù),返回的數(shù)據(jù)小數(shù)位數(shù)已經(jīng)根據(jù)DL645-2007協(xié)議的規(guī)定進行了處理。
res=dl645.readvaldata(2,saddr,idcode,rawdata,1000)
if (res==nil) then
print(string.format("
讀取失敗"));
else
print(string.format("
A相電壓:%6.2f",res));
--A相電壓數(shù)據(jù)在Modbus寄存器地址100,讀取2個寄存器地址。
lib_vmb.setvaluefc3(100,1,4,res);
end
--查看返回的原始數(shù)據(jù)
debug.printarray(rawdata);
--讀取A相電流
idcode={0x02,0x02,0x01,0x00}
res=dl645.readvaldata(2,saddr,idcode,rawdata,1000)
if (res==nil) then
print(string.format("
讀取失敗"));
else
print(string.format("
A相電流:%6.2f",res));
--A相電流數(shù)據(jù)在Modbus寄存器地址102,讀取2個寄存器地址。
lib_vmb.setvaluefc3(102,1,4,res);
end
--查看返回的原始數(shù)據(jù)
debug.printarray(rawdata);
--讀取電網(wǎng)頻率
idcode={0x02,0x80,0x00,0x02}
res=dl645.readvaldata(2,saddr,idcode,rawdata,1000)
if (res==nil) then
print(string.format("
讀取失敗"));
else
print(string.format("
電網(wǎng)頻率:%6.2f",res));
--電網(wǎng)頻率數(shù)據(jù)在Modbus寄存器地址104,讀取2個寄存器地址。
lib_vmb.setvaluefc3(104,1,4,res);
end
--查看返回的原始數(shù)據(jù)
debug.printarray(rawdata);
--讀取A相相角
idcode={0x02,0x07,0x01,0x00}
res=dl645.readvaldata(2,saddr,idcode,rawdata,1000)
if (res==nil) then
print(string.format("
讀取失敗"));
else
print(string.format("
A相相角:%6.2f",res));
--A相相角在Modbus寄存器地址106,讀取2個寄存器地址。
lib_vmb.setvaluefc3(106,1,4,res);
end
--查看返回的原始數(shù)據(jù)
debug.printarray(rawdata);
--讀取瞬時總有功功率
idcode={0x02,0x80,0x00,0x05}
res=dl645.readvaldata(2,saddr,idcode,rawdata,1000)
if (res==nil) then
print(string.format("
讀取失敗"));
else
print(string.format("
瞬時總有功功率:%6.4f",res));
--瞬時總有功功率在Modbus寄存器地址108,讀取2個寄存器地址。
lib_vmb.setvaluefc3(108,1,4,res);
end
--查看返回的原始數(shù)據(jù)
debug.printarray(rawdata);
syslib.ossleep(1000);
end
3、讀取需量數(shù)據(jù)
很多電表不支持需量數(shù)據(jù),請咨詢電表廠家以獲得相關(guān)信息。
print("讀取DL645需量數(shù)據(jù)。")
--啟用發(fā)送前導字符4個0xFE
--setopt函數(shù)設置DL645庫的全局參數(shù)。
--參數(shù)1:為選項編號,1-是否啟用發(fā)送前導字符4個0xFE
--參數(shù)2:為選項數(shù)據(jù),1-發(fā)送(默認),0-不發(fā)送前導字符
--dl645.setopt(1,1)
while (true) do
--表號
local saddr={20,19,01,01,50,02}
--idcode為16進制格式的4字節(jié)標識碼
--字節(jié)存儲順序,按照DL645-2007協(xié)議規(guī)定的DI3、DI2、DI1、DI0順序排列。
--請查閱DL645-2007協(xié)議手冊?;騾⒖?常用DL645數(shù)據(jù)轉(zhuǎn)Modbus"例程
--0x01,0x01,0x00,0x00標識碼為讀取正向有功需量及發(fā)生日期
local idcode={0x01,0x01,0x00,0x00}
--rawdata用于存儲電表應答的原始數(shù)據(jù)
local rawdata={0}
--maxqrdata為需量數(shù)據(jù),為浮點數(shù)
local res=0.0
--maxqrdt為需量發(fā)生日期
local maxqrdt
--readmaxrqdata讀取需數(shù)據(jù)及發(fā)生日期函數(shù)
--參數(shù)1:串口號,為0起,0為串口1,1為串口2,以此類推
--參數(shù)2:6個數(shù)字的表號,通常在電表上可以找到表號,直接填入即可,表號為BCD數(shù)字格式。
--參數(shù)3:為數(shù)組格式的標識碼,用于指出要讀取的電能數(shù)據(jù),應符合DL645-2007的定義,
--例如:為讀取正向有功需量數(shù)據(jù)及發(fā)生日期
--參數(shù)4:接收到的原始數(shù)據(jù)數(shù)組,從電表收到的原始數(shù)據(jù),如果讀取錯誤,此數(shù)據(jù)無效。
--參數(shù)5:通訊超時,發(fā)送讀取指令后,等待電表應答的超時,如果達到超時而未收到電表
--應答數(shù)據(jù),則認為電表無應答,將返回錯誤。
--返回2個數(shù)據(jù):
--數(shù)據(jù)1:需量數(shù)據(jù)(maxqrdata),為浮點數(shù)。
--數(shù)據(jù)2:需量發(fā)生日期(maxqrdt),數(shù)據(jù)為數(shù)組格式,數(shù)值按照{(diào)年,月,日,小時,分鐘}存儲。
maxqrdt,maxqrdata=dl645.readmaxrqdata(2,saddr,idcode,rawdata,1000)
if (maxqrdata==nil) then
print(string.format("
讀取失敗"));
else
print(string.format("
正向有功需量值:%2.4f",maxqrdata));
print(string.format("
正向有功需量發(fā)生日期:%d年%d月%d日%d時%d分",maxqrdt[1],maxqrdt[2],maxqrdt[3],
maxqrdt[4],maxqrdt[5]));
end
debug.printarray(rawdata);
--例子2 ,讀取A相正向有功需量數(shù)據(jù)
local idcode={0x01,0x15,0x00,0x00}
maxqrdt,maxqrdata=dl645.readmaxrqdata(2,saddr,idcode,rawdata,1000)
if (maxqrdata==nil) then
print(string.format("
讀取失敗"));
else
print(string.format("
A相正向有功需量值:%2.4f",maxqrdata));
print(string.format("
A相正向有功需量發(fā)生日期:%d年%d月%d日%d時%d分",maxqrdt[1],maxqrdt[2],maxqrdt[3],
maxqrdt[4],maxqrdt[5]));
end
debug.printarray(rawdata);
syslib.ossleep(1000);
end
您感興趣的產(chǎn)品PRODUCTS YOU ARE INTERESTED IN
安科瑞 光伏逆變器功率計量表 單相防逆流電表ACR10R-D16TE
ACR10R-D16TE ¥406安科瑞 光伏逆變器功率計量表 三相防逆流電表ACR10R-D16TE4
ACR10R-D16TE4 ¥1078低壓配電屏電力監(jiān)控儀 三相多功能電表 2路RS485通訊接口
PZ96L-E4/2C ¥980三相多功能電表 10kv高壓柜電能計量 液晶顯示 RS485通訊
PZ72L-E4/C ¥630安科瑞 三相電表 660V高壓表 2路4-20MA RS485通訊 高壓電能表
PZ96-E3/2MCG ¥1190智能制造網(wǎng) 設計制作,未經(jīng)允許翻錄必究 .? ? ?
請輸入賬號
請輸入密碼
請輸驗證碼
請輸入你感興趣的產(chǎn)品
請簡單描述您的需求
請選擇省份
聯(lián)系方式
深圳市一天廣聯(lián)科技有限公司