Internet PLC Forum
General => Technical support => Topic started by: taufiqsunar on March 13, 2012, 12:52:42 AM
-
Im a new user on Super PLC. Currently Im using FMD1616-10 to controlling slave device Autonics Temperature Controller TK4M with RS485.
The slave device can communicating with Modbus RTU Protocol.
The slave device ID is 1.
Im trying to access temperature value in that device. The address of present value is 03E8H, with function 04.
Im using the hard code from an example in this forum.
this is my code
Function first_set
SETPROTOCOL 3,1
Function read_autonics
A = &H03
B = &HE8
N = &H0A
FOR I = 0 TO 1
Z = INCOMM(3)
NEXT
call read_modbus
Function read_modbus
' This function implements MODBUS RTU function 04 using the INCOMM and
' OUTCOMM commands.
' The address to be read is in A
' The number of channel to be read is in N
' The data are returned in DM[201] to DM[201+N]
' DM[101] to DM[200] are used by this function
DM[101] = &H01 ' node address of slave
DM[102] = &H04 ' function 04
DM[103] = A ' upper 8 bit of address
DM[104] = B ' lower 8 bit of address
DM[105] = &H00 ' upper 8 bit of count
DM[106] = N ' lower 8 bit of count
X = CRC16 (DM[101],6) & &HFFFF ' compute the CRC16 of DM[101] to DM[106]
DM[107] = X / 256 ' upper 8 bit of CRC16
DM[108] = X & &HFF ' lower 8 bit of CRC16
FOR I = 1 to 8 ' send out the MODBUS RTU command in binary
OUTCOMM 3, DM[100+I]
NEXT
delay (10) ' delay for a while to wait for response
DM[111] = 0
TIMERPV[1] = 10 ' if the timer counts down, the loop is exited
WHILE DM[111] <> &H01 ' wait for response and store first byte
DM[111] = INCOMM (3)
IF TIMERPV[1] = 0
SETLCD 4,1, "NO RESPONSE "
RETURN
ENDIF
ENDWHILE
FOR I = 1 to N ' assuming small number of read data
DM[111+I] = INCOMM (3)
IF DM[111+I] < 0 GOTO @5: ENDIF
NEXT
@5 FOR I = 1 to N ' convert two bytes into one 16-bit word.
DM[200+I] = DM[112+I*2]*256+DM[113+I*2]
NEXT
in ladder diagram, on first row, there is a normally open button that can be executed once on starting the system, that activating function first_set
on second row, there is clock that triggering read_autonics every 1 second.
but that doesnt work at all. i checked the system with on-line monitoring and DM[111] just contain -1 in decimal and FFFFFFFF in hex.
any suggestion would be accepted! many thanks and regards
Taufiq Sunar
???
-
Note that you can actually run the SETSYSTEM 6,4 statement once and you can then use the READMODBUS and READMB2 to send function 04 to read data from your Modbus slave. This is simpler than using the TBASIC hardcoded method which is needed for older PLC such as T100MD+ that do not support the Function 04.
Most importantly, what is baud rate settings of your slave device? What is the communication format (7 or 8 data bits, none, even or odd parity, 1 or 2 stop bits). You may need to run the SETBAUD command once to define the PLC's RS485 port to the same baud rate of your Modbus slave.
Alternatively if your Modbus slave can be configured you should set it to the PLC's default baud rate, which is 38,400, 8, 1, n.
-
the baudrate of my slave device is just same as of the FMD1616-10, its 38400bps.
ok, so its my new code
SETPROTOCOL 3,1
SETSYSTEM 6,4
DM[111] = READMODBUS (3, 1, &H03E8)
but still there is no answer
or may I send you the manual by email?
-
If the baud rate of your Modbus slave device is the same as the PLC then your command is correct and you should be able retrieve the data from the device if the address is correct.
Did you use any other Modbus command that run on a PC to test the communication with the Modbus device? E.g. you can download the Modbus poll software from http://www.modbustools.com/modbus_poll.asp) Using a Modbus master program on a PC give you the visibility of the command sent and received to/from the device. You can also verify if the ID and the register address are correct.
Once you have managed to retrieve data from the PLC you will then have a better idea of the correct parameters to be passed to READMODBUS command to become a Modbus master.
Note: SETPROTOCOL 3,1 is not required since that is only to fix the PLC as Modbus RTU slave. When you are using READMODBUS command the PLC is working as a master. However, running SETPROTOCOL 3,1 would not affect READMODBUS command.
DId you try an address such as &H03E7 and &H03E9? This is to ensure that you have computed the address using the correct base addressing scheme (i.e. whether it is using 0 based or 1 based addressing)
-
I feel sory, but I dont have RS485 to USB converter here. Neither RS485 to RS232.
So the only way that I have is just connecting my slave device with PLC.
I have been trying to use address &H03E7 and &H03E9, but it doesnt work.
I just sent you the user manual for my slave device if you willing to read it.
Many thanks,
-
It is much more handy to have access from the PC to the RS485 device for troubleshooting communication. So it is good if you can get a USB-RS485 adapter or a RS232-to-RS485 adapter if your PC already has RS232 port. It also help to verify that the RS485 port on both the PLC and the slave device are working. It is also convenient for the PC to tap into the RS485 connection between the devices and use a serial monitor to monitor the communication between the PLC and the device. Right now we don't know if it is a hardware issue, a wiring issue, or a communication setting issues unless there is a way to monitor the communications.
Can you try to read the value of STATUS(2) after readmodbus:
E.g.
DM[111] = READMODBUS (3, 1, &H03E8)
S = STATUS(2)
If S is equals 1 it means that PLC is getting a response from the Modbus RTU slave. If S equals 0 it means it is not getting a response from the Modbus RTU slave and you will need check the settings of your RTU slave.
-
its turn out that the problem is on my device. there is a setting that set the communication time between the device and master.
thank you for your attention!
regards,