You are on page 1of 6

0001

0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0001

PROGRAM PLC_PRG
VAR
END_VAR
(*Demo program-CP terminal as slave CP_as_Modbus_RTU_slave.pro - AC500 program
CP_slave2.V6F and CP_slave3.V6F - CP440 programs
Main purpose: how to handle Modbus RTU communication using step chain ( in ST in this example )
Modbus RTU master : COM1 - PM571
Modbus RTU slaves: CP440 - slave2 and CP 440 slave 3
RS485, 19200, 8 1, even
The CP440 programs are identical, they consist of:
Screen 1: 3 actual values from the CPU, Screen 2: 2 actual values from the CPU
Screen 1: 2 set values to the CPU, Screen 2: 3 set values to the CPU
The communication consist of:
- writing 5 set values to slave 2 and slave3
- reading 5 actual values and the screen number from slave 2 and slave 3
*)

CP_communication

0002
RTU_Master
ADR
DATA_CP

en_master
1
slave_CP
FCT_CP
1000
ADDR_CP
NB_CP

COM_MOD_MAST
EN
DONE
COM
ERR
SLAVE
ERNO
FCT
TIMEOUT
ADDR
NB
DATA

done_master
err_master
erno_master

0001
0002
0003
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063

PROGRAM CP_communication
VAR
END_VAR
(*-----------S L A V E 2-------------------------------------------------------------------------------------------------*)
(*write five words to slave2 = screen 1 and 2, actual values 1,2 3,4,5*)
(*request*)
IF CHAIN=0 AND NOT done_master THEN
CHAIN:=100;
en_master:=TRUE;
slave_CP:=2;
FCT_CP:=16;
ADDR_CP:=0;
write_all_screens_data:=write_all_screens_slave2;
NB_CP:=5;
END_IF
(*reply*)
IF CHAIN=100 AND done_master THEN
CHAIN:=200;
en_master:=FALSE;
END_IF
(*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*)
(*request*)
IF CHAIN=200 AND NOT done_master THEN
CHAIN:=300;
en_master:=TRUE;
slave_CP:=2;
FCT_CP:=4;
ADDR_CP:=20;
NB_CP:=6;
END_IF
(*reply*)
IF CHAIN=300 AND done_master THEN
CHAIN:=400;
read_all_screens_data_slave2:=read_all_screens;
en_master:=FALSE;
END_IF
(*-----------S L A V E 3-------------------------------------------------------------------------------------------------*)
(*write five words to slave3 = screen 1 and 2, actual values 1,2 3,4,5*)
(*request*)
IF CHAIN=400 AND NOT done_master THEN
CHAIN:=500;
en_master:=TRUE;
slave_CP:=3;
FCT_CP:=16;
ADDR_CP:=10;
write_all_screens_data:=write_all_screens_slave3;
NB_CP:=5;
END_IF
(*reply*)
IF CHAIN=500 AND done_master THEN
CHAIN:=600;
en_master:=FALSE;
END_IF
(*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*)
(*request*)

0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084

IF CHAIN=600 AND NOT done_master THEN


CHAIN:=700;
en_master:=TRUE;
slave_CP:=3;
FCT_CP:=4;
ADDR_CP:=30;
NB_CP:=6;
END_IF
(*reply*)
IF CHAIN=700 AND done_master THEN
CHAIN:=0;
read_all_screens_data_slave3:=read_all_screens;
en_master:=FALSE;
END_IF
(*communication error*)
IF err_master THEN
error_CP:=erno_master;
END_IF

0001 VAR_GLOBAL
0002
0003
RTU_Master: COM_MOD_MAST;
0004
done_master: BOOL;
0005
err_master: BOOL;
0006
erno_master: WORD;
0007
en_master: BOOL;
0008
slave_CP: BYTE;
0009
FCT_CP: BYTE;
0010
ADDR_CP: BYTE;
0011
NB_CP: WORD;
0012
DATA_CP AT %MW0.100: WORD;
0013
error_CP: WORD;
0014
CHAIN: WORD;
0015
0016
read_all_screens AT %MW0.100: ARRAY [1..6] OF WORD;
0017
write_all_screens_data AT %MW0.100: ARRAY [1..5] OF WORD;
0018
0019
write_all_screens_slave2: ARRAY [1..5] OF WORD := 0,1,2,3,4;
0020
read_all_screens_data_slave2: ARRAY [1..6] OF WORD;
0021
write_all_screens_slave3: ARRAY [1..5] OF WORD := 10,11,12,13,14;
0022
read_all_screens_data_slave3: ARRAY [1..6] OF WORD;
0023
0024
0025 END_VAR

CP as Modbus RTU slave

CP440 - SLAVE 2
Screen 1 Slave 2

W0

W1
actual value 1

W2
actual value 2

W3
actual value 3

W4
actual value 4

W5 = control block
actual value 5

Screen 2 Slave 2

W25 = status block

W20

W21
set value 1

W22
set value 2

W23
set value 3

W 24
set value 4

set value 5
0

CP440 - SLAVE 3
Screen 1 Slave 3

W10

W11
actual value 1

W12
actual value 2

W13
actual value 3

W14
actual value 4

W15 = control block


actual value 5

Screen 2 Slave 3
W30

W35 = status block


W31

set value 1
10

W32
set value 2

11

W33
set value 3

12

W 34
set value 4

13

AC500 CPU as Modbus RTU master with two CP440 as Modbus RTU slaves

set value 5
14

AC500 CPU
Modbus RTU Master
1

CP440 slave 2

CP440 slave 3

request
reply

2
COM 1
3
R S 485, 19200, 8, 1 even

You might also like