Posts: 169
Threads: 58
Joined: Oct 2017
Reputation:
0
Hi all,
I'm scripting a process to simulate power meters with luamodbus functions, and it works wery well when I read all my registers with ModbusPoll scanner.
But using my script with a real Modbus master product, I have a lot of "connexion errors" (printed by the master).
@IP, port and slaveId are corrects...
Any idea about this ?
Thank's in advance.
All my best.
Dominique
Posts: 5035
Threads: 28
Joined: Aug 2017
Reputation:
230
Which script do you use?
------------------------------
Ctrl+F5
Posts: 169
Threads: 58
Joined: Oct 2017
Reputation:
0
(17.01.2023, 12:55) Daniel Wrote: Which script do you use?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
idPort =
503
idSlave =
3
PMname =
"iEM3155-B2"
idGroup =
idPort-500
idSteMapping1 =
0
idSteMapping2 =
0
idSetMapping3 =
6502
idSteMapping4 =
6502
groupList = {
{
addr =
idGroup ,
datatype =
"string" ,
name =
PMname ,
reg =
idPort ,
unit =
"" ,
tags =
"-" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"I1" ,
reg =
"3000" ,
unit =
"A" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"I2" ,
reg =
"3002" ,
unit =
"A" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"I3" ,
reg =
"3004" ,
unit =
"A" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"P1" ,
reg =
"3054" ,
unit =
"kW" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"P2" ,
reg =
"3056" ,
unit =
"kW" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"P3" ,
reg =
"3058" ,
unit =
"kW" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"P" ,
reg =
"3060" ,
unit =
"kW" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint32" ,
name =
"ET" ,
reg =
"3204" ,
unit =
"kWh" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"bool" ,
name =
"PH1" ,
reg =
"true" ,
unit =
"" ,
tags =
"-" },
{
addr =
idGroup ,
datatype =
"bool" ,
name =
"PH2" ,
reg =
"true" ,
unit =
"" ,
tags =
"-" },
{
addr =
idGroup ,
datatype =
"bool" ,
name =
"PH3" ,
reg =
"true" ,
unit =
"" ,
tags =
"-" },
{
addr =
idGroup ,
datatype =
"bool" ,
name =
"BTN" ,
reg =
"true" ,
unit =
"" ,
tags =
"-" },
{
addr =
idGroup ,
datatype =
"unit16" ,
name =
"CURSEUR" ,
reg =
"true" ,
unit =
"A" ,
tags =
"-" },
{
addr =
idGroup ,
datatype =
"bool" ,
name =
"BTN MONO" ,
reg =
"false" ,
unit =
"" ,
tags =
"-" },
{
addr =
idGroup ,
datatype =
"bool" ,
name =
"BTN TRI" ,
reg =
"true" ,
unit =
"" ,
tags =
"-" },
{
addr =
idGroup ,
datatype =
"string" ,
name =
"TYPE MONO-TRI" ,
reg =
"TRI" ,
unit =
"" ,
tags =
"-" },
{
addr =
idGroup ,
datatype =
"bool" ,
name =
"PHASE MONO" ,
reg =
"1" ,
unit =
"" ,
tags =
"-" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"I Phase AVG" ,
reg =
"3010" ,
unit =
"A" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"U Phase1" ,
reg =
"3028" ,
unit =
"V" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"U Phase2" ,
reg =
"3030" ,
unit =
"V" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"U Phase3" ,
reg =
"3032" ,
unit =
"V" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"U AVG" ,
reg =
"3036" ,
unit =
"V" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"P apparente" ,
reg =
"3076" ,
unit =
"kVA" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"Fact Pu" ,
reg =
"3084" ,
unit =
"" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"Frequence" ,
reg =
"3110" ,
unit =
"Hz" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint32" ,
name =
"QT E" ,
reg =
"3220" ,
unit =
"kVAR" ,
tags =
"modbus" },
{
addr =
idGroup ,
datatype =
"uint16" ,
name =
"QT P total" ,
reg =
"3068" ,
unit =
"kVAR" ,
tags =
"modbus" }
}
local proacSlaveReg =
6501
function ST_grpCreate (
STdatatype ,
STgroup ,
STname ,
STcomment ,
STunits ,
STtag )
grp.create ({
datatype =
STdatatype ,
address =
STgroup ,
name =
STname ,
comment =
STcomment ,
units =
STunits ,
tags = {
"EVCE" ,
STname },
})
end
for i ,
groupCurr in ipairs (
groupList )
do
STgroup =
groupCurr.addr.. "/" ..
idSlave.. "/" ..
i
if i ==
1 then
nomGroupe =
groupCurr.reg.. "#" ..
idSlave
valGroupe =
groupCurr.name
objGroupe =
STgroup
grp.write (
objGroupe ,
valGroupe )
end
if grp.find (
STgroup )
then
else
STdatatype =
groupCurr.datatype
STname =
nomGroupe.. "-" ..
groupCurr.name
STcomment =
"-"
STunits =
groupCurr.unit
STtag =
groupCurr.tags
ST_grpCreate (
STdatatype ,
STgroup ,
STname ,
STcomment ,
STunits ,
STtag )
end
end
if not mb then
log (
"EVCE cyclic - Modbus #2 : starting mb" )
require (
'luamodbus' )
mb =
luamodbus.tcp ()
mb :
open (
'0.0.0.0' ,
idPort )
mb :
setslave (
idSlave )
mb :
setmapping (
idSetMapping3 ,
idSetMapping2 ,
idSetMapping3 ,
idSetMapping4 )
mb :
setwritecoilcb (
function (
coil ,
value )
if coil ==
0 then
grp.write (
'0/0/12' ,
value ,
dt.bool )
else
alert (
'coil: %d = %s' ,
coil ,
tostring (
value ))
end
end )
mb :
setwriteregistercb (
function (
register ,
value )
if register ==
0 then
grp.write (
'0/0/13' ,
math.min (
100 ,
value ),
dt.scale )
else
alert (
'register: %d = %d' ,
register ,
value )
end
end )
addRegister =
proacSlaveReg
addRegister =
addRegister -
1
mb :
setregisters (
addRegister ,
idSlave )
log (
"EVCE cyclic - Modbus #2 : END OF starting mb" )
end
for i ,
groupCurr in ipairs (
groupList )
do
dataType =
groupCurr.datatype
if dataType ==
"bool" and groupCurr.tags ==
"-" then
nomGroupe =
groupCurr.addr.. "/" ..
idSlave.. "/" ..
i
if grp.find (
nomGroupe )
then
else
grp.write (
nomGroupe ,
groupCurr.reg )
end
end
if dataType ==
"string" and groupCurr.tags ==
"-" and i >
1 then
nomGroupe =
groupCurr.addr.. "/" ..
idSlave.. "/" ..
i
if grp.find (
nomGroupe )
then
else
grp.write (
nomGroupe ,
groupCurr.reg )
end
end
end
for i ,
groupCurr in ipairs (
groupList )
do
addRegister =
groupCurr.reg
dataTags =
groupCurr.tags
dataType =
groupCurr.datatype
nomGroupe =
groupCurr.addr.. "/" ..
idSlave.. "/" ..
i
value =
grp.getvalue (
nomGroupe )
if dataType ==
"uint16" and dataTags ==
"modbus" then
addRegister =
addRegister -
1
raw =
knxdatatype.encode (
value ,
dt.float32 ).
dataraw
r1 =
raw :
byte (
1 ) *
0x100 +
raw :
byte (
2 )
r2 =
raw :
byte (
3 ) *
0x100 +
raw :
byte (
4 )
mb :
setregisters (
addRegister ,
r1 ,
r2 )
end
if dataType ==
"uint32" and dataTags ==
"modbus" then
addRegister =
addRegister -
1
raw =
knxdatatype.encode (
value ,
dt.int64 ).
dataraw
r1 =
raw :
byte (
1 ) *
0x100 +
raw :
byte (
2 )
r2 =
raw :
byte (
3 ) *
0x100 +
raw :
byte (
4 )
r3 =
raw :
byte (
5 ) *
0x100 +
raw :
byte (
6 )
r4 =
raw :
byte (
7 ) *
0x100 +
raw :
byte (
8 )
mb :
setregisters (
addRegister ,
r1 ,
r2 ,
r3 ,
r4 )
end
end
mb :
handleslave ()
Posts: 8199
Threads: 43
Joined: Jun 2015
Reputation:
473
Consider using this script instead:
https://forum.logicmachine.net/showthrea...6#pid27726
Your current script does a lot of busy polling via grp.getvalue after each slave step which can lead to timeouts.
Posts: 169
Threads: 58
Joined: Oct 2017
Reputation:
0
(17.01.2023, 13:35) admin Wrote: Consider using this script instead: https://forum.logicmachine.net/showthrea...6#pid27726
Your current script does a lot of busy polling via grp.getvalue after each slave step which can lead to timeouts.
It seemed to me that the problem was there. Thank you for this new version that I will try immediately.
Many thank's too for your help.
Dominique