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:
- 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:
- 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 !
- 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 🙂
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 🙂
Hope it helped you, and feel free to ask questions you might have in comments !
Recent Comments