FAQs Técnicas

Realizar una pregunta

Comunicación HOMELYNK MODBUS RTU <-> PM9C


if not mb3 then
require('luamodbus')
mb3 = luamodbus.rtu()
-- Config. parameters in PM
mb3:open('/dev/RS485', 19200, 'N', 8, 2, 'H')
mb3:connect()
end
-- slave number configured in PM
mb3:setslave(2)
mb3:flush()

regTable = {
  { RegEddr=1000, count=2, regType="int", knx="10/2/32",unit=1000,descripcion="PM9C mA I1"}, --PM9C mA I1
  { RegEddr=1002, count=2, regType="int", knx="10/2/33",unit=1000,descripcion="PM9C  mA I2"}, --PM9C  mA I2
  { RegEddr=1004, count=2, regType="int", knx="10/2/34",unit=1000,descripcion="PM9C mA I3"}, --PM9C  mA I3
  { RegEddr=1006, count=2, regType="int", knx="10/2/35",unit=1000,descripcion="PM9C mA IN"}, --PM9C  mA IN
  { RegEddr=1008, count=2, regType="int", knx="10/2/36",unit=1000,descripcion="PM9C mV U12"}, --PM9C  mV U12
  { RegEddr=1010, count=2, regType="int", knx="10/2/37",unit=1000,descripcion="PM9C mV U23"}, --PM9C  mV U23
  { RegEddr=1012, count=2, regType="int", knx="10/2/38",unit=1000,descripcion="PM9C mV U31"}, --PM9C  mV U31
  { RegEddr=1014, count=2, regType="int", knx="10/2/39",unit=1000,descripcion="PM9C mV V1N"}, --PM9C  mV V1N
  { RegEddr=1016, count=2, regType="int", knx="10/2/40",unit=1000,descripcion="PM9C mV V2N"}, --PM9C  mV V2N
  { RegEddr=1018, count=2, regType="int", knx="10/2/41",unit=1000,descripcion="PM9C mV V3N"}, --PM9C  mV V3N
  { RegEddr=1020, count=2, regType="int", knx="10/2/31",unit=100,descripcion="PM9C F Hz*100"},  --PM9C  F Hz*100
  { RegEddr=1022, count=2, regType="int", knx="10/2/42",unit=100,descripcion="PM9C P Potencia Activa*100"},  --PM9C  P Potencia Activa*100
  { RegEddr=1024, count=2, regType="int", knx="10/2/43",unit=100,descripcion="PM9C Q Potencia Reactiva*100"},  --PM9C  Q Potencia Reactiva*100
  { RegEddr=1026, count=2, regType="int", knx="10/2/44",unit=100,descripcion="PM9C S Potencia Aparente*100"},  --PM9C  S Potencia Aparente*100
  { RegEddr=1028, count=2, regType="int", knx="10/2/45",unit=100,descripcion="PM9C PF Factor de Potencia *100"},  --PM9C  PF Factor de Potencia *100
  { RegEddr=1030, count=2, regType="int", knx="10/2/46",unit=1,descripcion="PM9C sPF Sector Factor de Potencia 1=ind 2 =cap"},  --PM9C  sPF Sector Factor de Potencia 1=ind 2 =cap
  { RegEddr=1032, count=2, regType="int", knx="10/2/47",unit=100,descripcion="PM9C Demanda de Potencia "},  --PM9C  Demanda de Potencia 
  { RegEddr=1034, count=2, regType="int", knx="10/2/48",unit=100,descripcion="PM9C Demanda de Max. Potencia"},  --PM9C  Demanda de Max. Potencia 
  { RegEddr=1036, count=2, regType="int", knx="10/2/49",unit=100,descripcion="PM9C Horas de Operacion"},  --PM9C  Horas de Operacion
  { RegEddr=1038, count=2, regType="int", knx="10/2/50",unit=1,descripcion="PM9C Energia Activa Total kWh"},  --PM9C  Energia Activa Total kWh
  { RegEddr=1040, count=2, regType="int", knx="10/2/51",unit=1,descripcion="PM9C Energia Reactiva Total kvarh"},  --PM9C  Energia Reactiva Total kvarh
  { RegEddr=1042, count=2, regType="int", knx="10/2/52",unit=1,descripcion="PM9C Energia Activa Parcial kWh"},  --PM9C  Energia Activa Parcial kWh
  { RegEddr=1044, count=2, regType="int", knx="10/2/53",unit=100,descripcion="PM9C Potencia Activa Fase 1 kW/100"},  --PM9C  Potencia Activa Fase 1 kW/100
  { RegEddr=1046, count=2, regType="int", knx="10/2/54",unit=100,descripcion="PM9C Potencia Activa Fase 2 kW/100"},  --PM9C  Potencia Activa Fase 2 kW/100
  { RegEddr=1048, count=2, regType="int", knx="10/2/55",unit=100,descripcion="PM9C Potencia Activa Fase 3 kW/100"},  --PM9C  Potencia Activa Fase 3 kW/100
  { RegEddr=1050, count=2, regType="int", knx="10/2/56",unit=100,descripcion="PM9C Potencia reActiva Fase 1 kvar/100"},  --PM9C  Potencia reActiva Fase 1 kvar/100
  { RegEddr=1052, count=2, regType="int", knx="10/2/57",unit=100,descripcion="PM9C Potencia reActiva Fase 2 kvar/100"},  --PM9C  Potencia reActiva Fase 2 kvar/100
  { RegEddr=1054, count=2, regType="int", knx="10/2/58",unit=100,descripcion="PM9C Potencia reActiva Fase 3 kvae/100"},  --PM9C  Potencia reActiva Fase 3 kvae/100
  { RegEddr=100, count=1, regType="int", knx="10/2/59",unit=1,descripcion="PM9C Ratio trafo TI"},  --PM9C Ratio trafo TI
  { RegEddr=101, count=1, regType="int", knx="10/2/60",unit=10,descripcion="PM9C Ratio trafo V"},  --PM9C Ratio trafo V
  { RegEddr=102, count=1, regType="int", knx="10/2/61",unit=1,descripcion="PM9C Tipo Conexion 0=4hilos 1=3hilos 2=3hilos 3=2hilos"},  --PM9C Tipo Conexion 0=4hilos 1=3hilos 2=3hilos 3=2hilos
  
 

 

  
  --      { RegEddr=3059, count=2, regType="float", knx="1/1/9"},
--      { RegEddr=3203, count=4, regType="int64", knx="1/1/10"},
    }

    for idx, register in pairs(regTable) do
      if register.regType=="int" then
      valueInt1, valueInt2 = mb3:readregisters(register.RegEddr, register.count)
    error="none"
    tipo = type (valueInt1)
    if tipo == "string" then 
      error=valueInt1
      valueInt1=tonumber(valueInt1)      
    end
    tipo = type (valueInt2)
    if tipo == "string" then 
      error=valueInt2
      valueInt2=tonumber(valueInt2)      
    end
    if valueInt1==65535 then valueInt1=0 end
    if valueInt2==65535 then valueInt2=0 end
    if not valueInt1 then valueInt1=0 end
    if not valueInt2 then valueInt2=0 end
    
        --log (register.knx,register.count, valueInt1, valueInt2)
    if register.count==1 then
    valueInt=(valueInt1) /register.unit       
    end
    if register.count==2 then
    valueInt=((valueInt1*1000)+valueInt2) /register.unit       
    end
    
    log ('Reg.:'..idx..' Mdbus.Addr:'.. register.RegEddr..' w:' ..register.count.. ' AG '.. register.knx .. '='.. valueInt.. ' Descp:'..register.descripcion..  ' error='..error..'' )

    grp.update(register.knx, valueInt, dt.float16) --sin salida al bus
    --grp.write(register.knx, valueInt, dt.float16) --con salida al bus

            elseif register.regType=="float" then
                     value1, value2 = mb3:readregisters(register.RegEddr,register.count)

                             if value1 then
                     valueFloat = bit.lshift(value1, 16) + value2
                     valueFloat = lmcore.inttohex(valueFloat, 4)
                     valueFloat = knxdatatype.decode(valueFloat, dt.float32)
                     grp.write(register.knx, valueFloat)
               end

           elseif register.regType=="int64" then
          valueInt1, valueInt2, valueInt3, valueInt4 = mb3:readregisters(register.RegEddr,register.count)
          if valueInt4 then
          valueInt64 = valueInt4
                log(valueInt64)
                grp.write(register.knx, valueInt64)
            end

 


       end    -- by esteve

      end     --end for

 

¿Ha sido útil?
¿Qué podemos hacer para mejorar la información?