cp400 as modbus rtu slave
TRANSCRIPT
-
8/17/2019 CP400 as Modbus RTU Slave
1/6
001 PROGRAM PLC_PRG
002 VAR
003 END_VAR
004 (*Demo program-CP terminal as slave CP_as_Modbus_RTU_slave.pro - AC500 program
005 CP_slave2.V6F and CP_slave3.V6F - CP440 programs
006
007 Main purpose: how to handle Modbus RTU communication using step chain ( in ST in this example )
008
009 Modbus RTU master : COM1 - PM571
010 Modbus RTU slaves: CP440 - slave2 and CP 440 slave 3
011 RS485, 19200, 8 1, even
012 The CP440 programs are identical, they consist of:013 Screen 1: 3 actual values from the CPU, Screen 2: 2 actual values from the CPU
014 Screen 1: 2 set values to the CPU, Screen 2: 3 set values to the CPU
015 The communication consist of:
016 - writing 5 set values to slave 2 and slave3
017 - reading 5 actual values and the screen number from slave 2 and slave 3
018
019 *)
001
CP_communication
002
done_master
COM_MOD_MAST
RTU_Master
EN
COM
SLAVE
FCT
TIMEOUT
ADDR
NB
DATA
DONE
ERR
ERNO
err_master
erno_master
en_master
1
slave_CP
FCT_CP
1000
ADDR_CP
NB_CP
ADR
DATA_CP
-
8/17/2019 CP400 as Modbus RTU Slave
2/6
001 PROGRAM CP_communication
002 VAR
003 END_VAR
001
002 (*-----------S L A V E 2-------------------------------------------------------------------------------------------------*)
003 (*write five words to slave2 = screen 1 and 2, actual values 1,2 3,4,5*)
004
005 (*request*)
006 IF CHAIN=0 AND NOT done_master THEN
007 CHAIN:=100;
008 en_master:=TRUE;
009 slave_CP:=2;010 FCT_CP:=16;
011 ADDR_CP:=0;
012 write_all_screens_data:=write_all_screens_slave2;
013 NB_CP:=5;
014 END_IF
015
016 (*reply*)
017 IF CHAIN=100 AND done_master THEN
018 CHAIN:=200;
019 en_master:=FALSE;
020 END_IF
021
022 (*read six words from slave2 - screen 1 and 2, set values 1,2,3,4,5. In the sixth word is the actual screen number*)
023
024 (*request*)
025 IF CHAIN=200 AND NOT done_master THEN
026 CHAIN:=300;
027 en_master:=TRUE;
028 slave_CP:=2;
029 FCT_CP:=4;
030 ADDR_CP:=20;
031 NB_CP:=6;
032 END_IF
033
034 (*reply*)035 IF CHAIN=300 AND done_master THEN
036 CHAIN:=400;
037 read_all_screens_data_slave2:=read_all_screens;
038 en_master:=FALSE;
039 END_IF
040
041 (*-----------S L A V E 3-------------------------------------------------------------------------------------------------*)
042 (*write five words to slave3 = screen 1 and 2, actual values 1,2 3,4,5*)
043
044 (*request*)
045 IF CHAIN=400 AND NOT done_master THEN
046 CHAIN:=500;047 en_master:=TRUE;
048 slave_CP:=3;
049 FCT_CP:=16;
050 ADDR_CP:=10;
051 write_all_screens_data:=write_all_screens_slave3;
052 NB_CP:=5;
053 END_IF
054
055 (*reply*)
056 IF CHAIN=500 AND done_master THEN
057 CHAIN:=600;
058 en_master:=FALSE;
059 END_IF
060
061 (*read six words from slave3 - screens 1 and 2, set values 1,2,3,4,5. In the sixth word is the actual screen number*)
062
063 (*request*)
-
8/17/2019 CP400 as Modbus RTU Slave
3/6
064 IF CHAIN=600 AND NOT done_master THEN
065 CHAIN:=700;
066 en_master:=TRUE;
067 slave_CP:=3;
068 FCT_CP:=4;
069 ADDR_CP:=30;
070 NB_CP:=6;
071 END_IF
072
073 (*reply*)
074 IF CHAIN=700 AND done_master THEN
075 CHAIN:=0;076 read_all_screens_data_slave3:=read_all_screens;
077 en_master:=FALSE;
078 END_IF
079
080 (*communication error*)
081 IF err_master THEN
082 error_CP:=erno_master;
083 END_IF
084
-
8/17/2019 CP400 as Modbus RTU Slave
4/6
001 VAR_GLOBAL
002
003 RTU_Master: COM_MOD_MAST;
004 done_master: BOOL;
005 err_master: BOOL;
006 erno_master: WORD;
007 en_master: BOOL;
008 slave_CP: BYTE;
009 FCT_CP: BYTE;
010 ADDR_CP: BYTE;
011 NB_CP: WORD;
012 DATA_CP AT %MW0.100: WORD;013 error_CP: WORD;
014 CHAIN: WORD;
015
016 read_all_screens AT %MW0.100: ARRAY [1..6] OF WORD;
017 write_all_screens_data AT %MW0.100: ARRAY [1..5] OF WORD;
018
019 write_all_screens_slave2: ARRAY [1..5] OF WORD := 0,1,2,3,4;
020 read_all_screens_data_slave2: ARRAY [1..6] OF WORD;
021 write_all_screens_slave3: ARRAY [1..5] OF WORD := 10,11,12,13,14;
022 read_all_screens_data_slave3: ARRAY [1..6] OF WORD;
023
024
025 END_VAR
-
8/17/2019 CP400 as Modbus RTU Slave
5/6
CP as Modbus RTU slave
W0
0
actual value1
W1
1
actual value 2
W1
1
actual value 2
W2
2
actual value 3
W2
2
actual value 3
W3
3
actual value 4
W3
3
actual value 4
W 4
4
actual value 5
W 4
4
actual value 5
W20
0
set value1
W21
0
set value2
W22
0
set value3
W23
0
set value4
W24
0
set value5
Screen 1 –S lave 2
Screen 2 – Slave 2 W25 = status block
W5 = control block
W10
0
actual value1
W11
0
actual value 2
W11
0
actual value 2
W12
0
actual value 3
W12
0
actual value 3
W13
0
actual value 4
W13
0
actual value 4
W14
0
actual value 5
W14
0
actual value 5
W30
10
set value1
W31
11
set value2
W32
12
set value3
W33
13
set value4
W34
14
set value5
Screen 1 –S lave 3
Screen 2 – Slave 3 W35 = status block
W15 = control block
CP440 - SLAVE 2
CP440 - SLAVE 3
AC500 CPU as Modbus RTU master with two CP440 as Modbus RTU slaves
-
8/17/2019 CP400 as Modbus RTU Slave
6/6
AC500 CPU
Modbus RTU Master
COM 1
1
2
3
4
1
6
CP440 – slave 2
1
6
CP440 – slave 3
RS 485, 19200, 8, 1 even
request
reply