Select Page

So today I went on site for interfacing a NetLinx AMX system with Sauter HVAC system. The HVAC system is interfaced through a PC that translates internal bus to more regular Modbus/Jbus protocol.

Modbus is a pretty simple protocol but its implementation is not so simple due to three facts:

  1. It uses a pretty complex system to calculate a mandatory checksum at end of each message. But with help of a friend Jon, and also piece of code made by Crestron for their Modbus module, I was able to automate creation of Modbus messages in my NetLinx program. Here is result for exemple for a read command:
  2. STACK_VAR
    CHAR TEMP[6]
    CHAR INTERRO_A_ENVOYER[8]
    LONG TEMP_1
    LONG XFLG
    LONG I
    LONG J
    LONG CRC
    {
    TEMP = “1,3,0,((ETAPE-1)*4),0,2”
    CRC = $FFFF
    FOR(I=1;I<7;I++)
    {
    TEMP_1 = TEMP[I]
    FOR(J=1;J<9;J++)
    {
    XFLG = (CRC^TEMP_1) & $0001
    CRC = CRC >> 1
    IF(XFLG<>0)
    {
    CRC = CRC ^ $A001
    }
    TEMP_1 = TEMP_1 / 2
    }
    }
    I = CRC / 256
    J = CRC – (I*256)
    INTERRO_A_ENVOYER = “TEMP,J,I”
    SEND_STRING dvCLIM,INTERRO_A_ENVOYER
    }

    That sample computes automatically checksum for a read message of two bytes 🙂

  3. Second problem is for answer you get back from HVAC as temperature value is coded with IEEE system. I looked at it on internet but it looks pretty complex to encode, so for now I just do a comparison between know values and it allows me to get correct value, at price of extra comparison work but it functions perfect 🙂 If someone already did a piece of code in NetLinx to encode/decode IEEE value, I’m interested in !
  4. Last point very important with Modbus protocol is that it doesn’t speak by itself 🙁 So each time you want to know something you have to issue a read command. So best way is to use a timeline you run in background that continuously asks values at system so you keep always value up to date 🙂

Hope it helped you, and feel free to ask questions you might have in comments !