|
//-----------------------------------------------------------------------------
// Wireless M-Bus receiver example
// This example listens for data from the device from the OMS specification Annex N.2.3.
//-----------------------------------------------------------------------------
INCLUDE rtcu.inc
// Uncomment math.inc to add math library support.
INCLUDE math.inc
// Input variables that can be configured via the configuration dialog (These are global)
VAR_INPUT
END_VAR;
// Output variables that can be configured via the configuration dialog (These are global)
VAR_OUTPUT
END_VAR;
// These are the global variables of the program
VAR
mb : SYSHANDLE;
clock : clockLinsecToTime;
recInfo : mbusRecordGetInfo;
END_VAR;
FUNCTION RegisterDevices;
VAR
rc : INT;
key : ARRAY[1..16] OF USINT;
END_VAR;
// wM-Bus Meter with integrated radio and Security profile B from OMS specification Annex N.2.3.
key[1] := 16#00;
key[2] := 16#01;
key[3] := 16#02;
key[4] := 16#03;
key[5] := 16#04;
key[6] := 16#05;
key[7] := 16#06;
key[8] := 16#07;
key[9] := 16#08;
key[10] := 16#09;
key[11] := 16#0a;
key[12] := 16#0b;
key[13] := 16#0c;
key[14] := 16#0d;
key[15] := 16#0e;
key[16] := 16#0f;
rc := mbusSlaveRegister(handle:=mb, sec_addr:="1234567893153303", index:=1, key:=ADDR(key));
DebugFmt(message:="mbusSlaveRegister(): \1", v1:=rc);
END_FUNCTION;
FUNCTION UnRegisterDevices;
VAR
rc : INT;
i : SINT;
END_VAR;
FOR i:=1 TO 64 DO
rc := mbusSlaveUnRegister(handle:=mb, index:=i);
DebugFmt(message:="mbusSlaveUnRegister(): \1", v1:=rc);
END_FOR;
END_FUNCTION;
FUNCTION GetTime:STRING;
VAR_INPUT
linsec : DINT;
END_VAR;
clock(linsec:=linsec);
GetTime:=strFormat(format:="\1:\2:\3", v1:=clock.hour, v2:=clock.minute, v3:=clock.second);
END_FUNCTION;
FUNCTION GetDate:STRING;
VAR_INPUT
linsec : DINT;
END_VAR;
clock(linsec:=linsec);
GetDate:=strFormat(format:="\1-\2-\3", v1:=clock.year, v2:=clock.month, v3:=clock.day);
END_FUNCTION;
FUNCTION DumpRecords;
VAR
rc, type : INT;
count, i : INT;
str, unit : STRING;
scale : FLOAT;
d : DINT;
END_VAR;
count := mbusRecordCount(handle:=mb);
DebugFmt(message:=" Records: \1", v1:=count);
FOR i := 0 TO count DO
recInfo(handle:=mb, index:=i);
IF recInfo.ready THEN
str := " Record "+intToStr(v:=i)+", Type: " + intToStr(v:=recInfo.type);
scale:=1.0;
unit:="";
str := str + ", VIF: "+sintToHex(v:=recInfo.VIF)+", VIFE: "
+ sintToHex(v:=recInfo.VIFE[1])+" "+sintToHex(v:=recInfo.VIFE[2]);
DebugFmt(message:=str);
DebugFmt(message:=" Addr: "+recInfo.address);
DebugFmt(message:=" Dev: \1, Func: \2, Tar \4, Stor: "+dintToStr(v:=recInfo.storage),
v1:=recInfo.device, v2:=recInfo.func, v4:=recInfo.tariff);
DebugFmt(message:=" Type: "+recInfo.text);
type := mbusRecordGetType(handle:=mb, index:=i);
DebugFmt(message:=" Data Type: \1", v1:=type);
IF recInfo.VIF = 16#14 THEN
// Volume [1e-2 m^3]
unit := "m^3";
scale := 0.01;
END_IF;
IF type = _MBUS_TYPE_INT32 THEN
rc := mbusRecordGetInt(handle:=mb, index:=i, value:=d);
DebugMsg(message:=" Value: "+floatToStr(v:=FLOAT(d)*scale)+" "+unit);
END_IF;
IF type = _MBUS_TYPE_TIME THEN
rc := mbusRecordGetLinsec(handle:=mb, index:=i, value:=d);
IF recInfo.VIF = 16#6D THEN
// time + date
DebugMsg(message:=" Value: "+GetDate(linsec:=d)+" "+GetTime(linsec:=d));
ELSE
// Just date
DebugMsg(message:=" Value: "+GetDate(linsec:=d));
END_IF;
END_IF;
END_IF;
END_FOR;
END_FUNCTION;
PROGRAM wmbus_rec;
// These are the local variables of the program block
VAR
rc : INT;
info : mbusRecordSlaveInfo;
END_VAR;
// The next code will only be executed once after the program starts
rc := mbusOpen(type:=2, handle:=mb, mode:=_MBUS_MODE_T1_C);
DebugFmt(message:="mbusOpen(): \1", v1:=rc);
// Enable this line to clear the registrations
//UnRegisterDevices();
// Create device registrations
RegisterDevices();
// Only receive from registered devices
rc := mbusFilterEnable(handle:=mb, enable:=TRUE);
DebugFmt(message:="mbusFilterEnable(): \1", v1:=rc);
BEGIN
// Code from this point until END will be executed repeatedly
// Wait for 15 seconds for data from 1234567893153303
rc := mbusDataReceive(handle:=mb, filter:="1234567893153303", timeout:=15);
DebugFmt(message:="mbusDataReceive: \1", v1:=rc);
IF rc = 1 THEN
info(handle:=mb);
IF info.ready THEN
DebugFmt(message:="Info for \4:", v4:=info.id);
DebugFmt(message:=" Enc: \1", v1:=info.enc_state);
DebugFmt(message:=" Man: "+info.manufacturer);
DebugFmt(message:=" Ver: \1", v1:=info.version);
DebugFmt(message:=" Med: \1", v1:=info.medium);
DebugFmt(message:=" AN : \1", v1:=info.accessnumber);
DebugFmt(message:=" Sta: \1", v1:=info.status);
DebugFmt(message:=" Addr: "+info.sec_addr);
DebugFmt(message:=" Sig: \1", v1:=info.signal);
END_IF;
DumpRecords();
END_IF;
END;
END_PROGRAM;
|