Pnspo!: Modbus Solution Cp1H / Cp1L / Cj1 / Cj2 / Cs1

Download as pdf or txt
Download as pdf or txt
You are on page 1of 17

PNSPO!

!
Modbus Solution
CP1H / CP1L / CJ1 / CJ2 / CS1

Version 2.05
6/18/2009
Section 1. Overview
The Omron CP1H and CP1L PLCs offer a built in function called ‘Easy Modbus’, that
performs a Modbus RTU Master function, allowing the PLC to communicate with
devices that use the Modbus RTU protocol, such as inverters, scales, temperature
controllers, etc. The CJ1 / CJ2 / CS1 PLCs support Modbus through a Protocol Macro.
While the ‘Easy Modbus’ or ‘Protocol Macro’ functions are powerful functions, they
require the user to develop a ladder program to feed data to and retrieve data from the
‘Easy Modbus’ or ‘Protocol Macro’ function. This can be intimidating to a user.
This Modbus Solution was developed to provide a pre-written solution to Modbus RTU
applications, supporting up to 100 ‘items’ to read and 100 ‘items’ to write. An ‘item’ is
an individual data point on a device such as ‘present temperature of node 4’, or
‘frequency reference on node 7’.
The Modbus RTU function codes that are supported are:

01: Read Coil Status


02: Read Input Status
03: Read Holding Registers (1 or 2 registers)
04: Read Input Registers (1 – 32 coils)
05: Force Single Coil
06: Preset Single Register
0F: Force Multiple Coils (1 – 32 coils)
10: Preset Multiple Registers (1 or 2 registers)

The NS series HMI application that is provided is not necessary for the solution, but is
intended to assist in setup and monitoring of the Modbus Solution.

Memory Considerations:

The Modbus Solution uses ~ 1,500 steps of PLC User Memory for CP1H /
CP1L and ~1600 steps for CJ1 / CJ2 / CS1.
This represents the following amount for each PLC CPU type. Keep this
memory usage in mind when selecting a PLC CPU for an application.

PLC Total UM Remaining % Used


CP1H-X, XA, Y/ CJ1M-CPU13 21,504 Steps ~ 20,000 steps 7%
CP1L-M / CJ1M-CPU12 11,264 Steps ~ 9,700 Steps 14%
CP1L-L / CJ1M-CPU11 6,144 Steps ~ 4,600 Steps 25%
CS1G-CPU42-H / CJ1G-CPU42-H 11,264 Steps ~ 9,700 Steps 14%
CS1G-CPU43-H / CJ1G-CPU43-H 21,504 Steps ~ 20,000 steps 7%
CS1G-CPU44-H / CJ1G-CPU44-H 31,744 Steps ~ 30,000 steps 5%
Others – Negligible Memory Usage
Section 2. Hardware Requirements
PLC To use the Modbus Solution

1 CP1H or CP1L PLC


1 CP1W-CIF11 or CIF12 RS422/485 serial adapter
or
1 CJ1 / CJ2 / CS1 with Serial Communications Unit (SCU41 or SCU31)

To use the NS Series HMI application

The PLC must have an RS232 port (CP1H or CP1L-M type, or CJ1 / CJ2/ CS1)
1 CP1W-CIF01 for communications to the HMI from CP1H or CP1L
1 NS8 HMI
1 C200H-CN510-EU (or similar) PLC to NS cable

Section 3. Setup for CP1L / CP1H


The CP1W-CIF11 must be installed in the rightmost option board position. For
CPUs with 2 option board positions, do not use the leftmost position. The
ladder program was not written for this option board position.

For RS-485 communications, set the DIP switches on the back of the CP1W-
CIF11 or CIF12 adapter as shown prior to installing in the PLC.
The Port that is being used for Modbus communications will need to be
configured as shown. Be certain to download the PLC settings to configure the
serial port, and make certain that the DIP Switch associated with the port is OFF.
This is DIP Switch 4 on CP1L-L, and DIP Switch 5 on CP1L-M and CP1H.
Section 3. Setup for CJ1 / CJ2 / CS1

The CJ1 / CJ2 / CS1 configuration for the Modbus Solution requires an SCU31 /
SCU41 module.
The built in ports on the PLC CPU cannot be used for this function. An SCB
(Serial Communications Board) on a CS1 cannot be used for this function.

The SCU module must be set for unit #F, and the top communications port is
used as shown. Set the 2/4 wire mode for 2 wire (RS485), and the Terminating
Resistance switch to ON.
The port must be configured through the I/O table of CX Programmer, and setup
as shown below.

The Protocol Macro must also be downloaded to the SCU module via CX
Protocol.
Section 4. Data Layout for Modbus RTU data exchange
To read and write data from and to a Modbus RTU capable device, the user simply
manipulates data in data tables in the PLCs DM (Data Memory) area. The Modbus
Solution automatically communicates to the Modbus devices based on the data tables.

To read from a Modbus Slave device: The user fills in the ‘Read Data’ Table as follows.
Item 1 is shown, but the data layout is the same for all items. Shaded items are set by
the user, non-shaded items are populated by the Modbus Solution.

Item 1: D5000 – D5009


Item 2: D5010 – D5019

Item 100 : D5990 – D5999

The PLC program will cycle through the items in order. To mark the last item to read,
enter ‘F000’ in the ‘Last Item to Read’ memory location for the last ‘item’. Set ‘0000’ for
all but the last ‘item’. If there are no read items for the application, set D5009 to ‘E000’.

Address  Setting   
D5000  Modbus Slave Node Number  In HEX 
D5001  Modbus Function Code  In HEX 
D5002  Starting Modbus Address to Read  In HEX 
D5003  Number of Modbus Addresses to Read  In HEX, 0 – 31 for coils, 0 or 1 for registers 
D5004  First word of Response Data   
D5005  Second word of Response Data  Not used if < 16 coils or 1 register is read 
D5006  Not used   
D5007  Not used   
D5008  Is the Data Valid?  FFFF = invalid (ie error), 0000 = valid, F000 = 
data not yet read (set on powerup) 
D5009  Last Item to Read?  Set to F000 if this is the last item to read 
  
Example: To read the present frequency and current for an Omron 3G3JX inverter, the
Read Data Tables would be configured as follows:

Address  Value  Notes    Address  Value  Notes 


D5000  0001  Node 1    D5010  0001  Node 1 
D5001  0003  Function code 3    D5011  0003  Function code 3 
D5002  1001  ‘Frequency’ Register    D5012  1002  ‘Current’ Register 
D5003  0001  Read 1 Register    D5013  0001  Read 1 Register 
D5004  0000  Freq. Returned Here    D5014  0000  Current Returned Here 
D5005  0000      D5015  0000   
D5006  0000  Not Used    D5016  0000  Not Used 
D5007  0000  Not Used    D5017  0000  Not Used 
D5008  0000  Data is valid    D5018  0000  Data is valid 
D5009  0000  Not last item    D5019  F000  Last Item 
To write to a Modbus Slave device: The user fills in the ‘Write Data’ Table as follows.
Item 1 is shown, but the data layout is the same for all items. Shaded items are set by
the user, non-shaded items are populated by the Modbus Solution.

Item 1: D6000 – D6009


Item 2: D6010 – D6019

Item 100 : D6990 – D6999

The PLC program will cycle through the items in the read table, and write data to a
Modbus Slave only on Data Change. To mark the last item to write, enter ‘F00x’ in the
‘Last Item to Write’ memory location for the last ‘item’. Set ‘000x’ for all but the last
‘item’.
To set a particular write ‘item’ to FFFF after the data is written to the device, set
xxxA in the ‘Last Item’ field. This allows the same value to be written over and over
again in the Data register of the Modbus Solution, and the Modbus Solution will
correctly detect the changing data.

0000 = Not Last Write Item, do not detect same value write
000A = Not Last Write Item, detect same value write
F000 = Last Write Item, do not detect same value write
F00A = Last Write Item, detect same value write.

Address  Setting   
D6000  Modbus Slave Node Number  In HEX 
D6001  Modbus Function Code  In HEX 
D6002  Starting Modbus Address to Write  In HEX 
D6003  Number of Modbus Addresses to Write  In HEX, 0 – 31 for coils, 0 or 1 for registers 
D6004  First word of Write Data   
D6005  Second word of Write Data  Not used if < 16 coils or 1 register is read 
D6006  Copy of last data sent first write word  Used to detect ‘changed’ data 
D6007  Copy of last data sent second write word Used to detect ‘changed’ data 
D6008  Last Write Successful?  FFFF = unsuccessful (ie error), 0000 = valid, 
F000 = data not yet written (set on powerup) 
D6009  Last Item to Write / Detect Same Data?  0000, 000A, F000, F00A as explained above 
Example: To Write a Frequency Reference for Omron 3G3JX inverters at nodes 9 and
12, the Write Data Tables would be configured as follows:

Address  Value  Notes    Address  Value  Notes 


D6000  0009  Node 9    D6010  000C  Node 12 
D6001  0010  Function code 10    D6011  0010  Function code 10 
D6002  0001  ‘F Ref’ Register    D6012  0001  ‘F Ref’ Register 
D6003  0001  Write 1 Register    D6013  0001  Write 1 Register 
D6004  0096  96 = 15.0 hz    D6014  017C  17C = 38.0 hz 
D6005  0000  Not used    D6015  0000  Not used 
D6006  0000  Program controlled    D6016  0000  Program controlled 
D6007  0000  Program controlled    D6017  0000  Program controlled 
D6008  0000  Last Write Successful?    D6018  0000  Last Write Successful? 
D6009  000A  Not last item, detect    D6019  F00A  Last Item, detect same write 
same write value  value 
Section 5. Used Memory Areas
The following memory areas are used for the Modbus Solution, and cannot be used for
other purposes in the PLC:

Timers 13, 14, 15


W0 – W249
D5000 – D6999
Jump / Jump End DF, EF, FF

Section 6. Error Logging and Cycle Time Monitoring


The Modbus Solution has build in error detection. Each read ‘item’ and write ‘item’ has
its own status area. For ‘read’ items, this is the ‘Is the Data Valid’ field. For ‘write’ items,
this is the ‘Last Write Successful’ field.

Each Read / Write has a 3 retry on timeout setting. The timeout value is set in the PLC
port setup for CP1H / CP1L, and in the Protocol macro for CJ1 / CJ2 / CS1.

The Modbus Solution has an overall error log. The last 5 errors are logged as follows:
(W220 + W221 is the most recent error). Consult the Modbus specification for the
slave device to determine the cause and solution to the Modbus error.

Address Item Example


W220 Record 1 Node Number Function Code 0205 (node 2, function 05)
W221 Record 1 DM Area that caused error 1392 (5010 DEC) = D5010
W222 Record 2 Node Number Function Code 0710 (node 7, function 10)
W223 Record 2 DM Area that caused error 17A2 (6050 DEC) = D6050
W224 Record 3 Node Number Function Code 0801 (node 8, function 01)
W225 Record 3 DM Area that caused error 13CE (5070 DEC) = D5070
W226 Record 4 Node Number Function Code 0A03 (node 10, function 03)
W227 Record 4 DM Area that caused error 157C (5500 DEC) = D5500
W228 Record 5 Node Number Function Code 0710 (node 4, function 10)
W229 Record 5 DM Area that caused error 1838 (6200 DEC) = D6200

There is also a complete copy of the Modbus string sent out the port, and received
back in the port for the last Modbus error. This is for CP1H / CP1L Only. For CJ1 /
CJ2 / CS1, use the Data Trace function in CX Protocol to analyze the Modbus strings.
W230 – W239 = Last sent Modbus Command that caused an error.
W240 – W249 = Last received Modbus command that contained an error.

The current polling cycle time can be viewed in W216 as xx.xx seconds as a BCD data
type. Example: W216 = 0140 means is takes 1.40 seconds to scan all the ‘items’ in
the read tables.

The CP1H / CP1L PLCs scan 10 ‘items’ in ~ 0.40 seconds (at 19,200 bps).
The CJ1 / CJ2 / CS1 PLCs scan 10 ‘items’ in ~ 1.30 seconds (at 19,200 bps).
The difference in these times is due to the overhead associated with Protocol Macros.
Section 7. Data Layout by Function

Note: For function code 3 or 4, when reading a single 2 register parameter (such as
Accel in a 3G3JX), the result is word swapped.
Note: For function code 10, when writing a single 2 register parameter (such as Accel
in a 3G3JX), the data needs to be presented in a word swapped format.
Section 8. Table Setup Example for 3G3JX Inverter
Read Item 1 = Read All Status Coils from node 1
Read Item 2 = Read Frequency and Current from Node 1

Address  Value  Notes    Address  Value  Notes 


D5000  0001  Node 1    D5010  0001  Node 1 
D5001  0001  Function code 1    D5011  0003  Function code 3 
D5002  0000  Start at Coil 0    D5012  1001  ‘Frequency’ Register 
D5003  0019  Read 25 Coils (19 HEX)    D5013  0002  Read 2 Registers 
D5004  0000  Coil status    D5014  0000  Frequency Returned Here 
D5005  0000  Coil status    D5015  0000  Current Returned Here 
D5006  0000  Not Used    D5016  0000  Not Used 
D5007  0000  Not Used    D5017  0000  Not Used 
D5008  0000  Data is valid    D5018  0000  Data is valid 
D5009  0000  Not last item    D5019  F000  Last Item 

Write Item 1 = Control Run / Stop and FWD / REV to Node 1


Write Item 2 = Write Frequency to Node 1
Write Item 3 = Reset Inverter Alarm to Node 1

Address  Value  Notes    Address  Value  Notes 


D6000  0001  Node 1    D6010  0001  Node 1 
D6001  000F  Function code F    D6011  0010  Function code 10 
D6002  0000  Start Coil 0    D6012  0001  ‘F Ref’ Register 
D6003  0002  Write 2 Coils    D6013  0001  Write 1 Register 
D6004  xx00  0100 :Run, 0000 :Stop    D6014  xxxx  Frequency 
D6005  0000  Not used    D6015  0000  Not used 
D6006  0000  Program controlled    D6016  0000  Program controlled 
D6007  0000  Program controlled    D6017  0000  Program controlled 
D6008  0000  Last Write Successful?    D6018  0000  Last Write Successful? 
D6009  000A  Not last item, detect    D6019  000A  Not last item, detect same 
same write value  write value 

Address  Value  Notes 


D6020  0001  Node 1 
D6021  0005  Function code 5 
D6022  0003  Reset Alarm Coil 
D6023  0001  Write 1 Coil 
D6024  xx00  FF00 :Reset 
D6025  0000  Not used 
D6026  0000  Program controlled 
D6027  0000  Program controlled 
D6028  0000  Last Write Successful? 
D6029  F00A  Last Item, detect same 
write value 
Appendix A: 3G3JX Inverter Setup (provided as reference material)

1. Connect the PLC to the inverter as shown

2. Initialize the Inverter (to erase any previous settings) as follows:


a. Unplug the inverter.
b. Verify that S7 is set for OPE. Leave S8 in the Off position.

c. Plug in the inverter and wait ~ 30 seconds in case the inverter is set to
use Modbus for communications. This lets it timeout.
d. Set B84 to 01.
e. Press and hold the Mode and Decrement Keys simultaneously.
f. Press and Hold the Stop/Reset key until the display blinks.
g. Release all 3 keys and let the inverter go through its initialization.
3. Change the following Inverter Parameters using the Operator Keypad.
a. A001 = 03. Set Modbus as Frequency Reference Input
b. A002 = 03. Set Modbus as the Run/ Stop command reference
c. C070 = 03. Set Modbus as the input method (not keypad).
d. C071 = 06. Set 19,200 as the baud rate

4. Unplug the inverter after making these changes.

5. Set DIP S7 to 485. Leave S8 in the Off position.

6. Plug in the inverter.


Appendix B: 3G3JX Coil Numbers

When starting at Coil 1 (set in the read item as ‘0’ by Modbus) for a read or write,
the coil numbers are as follows for a 3G3JX. This example uses Read Item 1
(D5000) as the item for reading the coils.
Shaded = Read only

5004.00 Coil 9  Multi‐Function Input 3 


5004.01 Coil 10  Multi‐Function Input 4 
5004.02 Coil 11  Multi‐Function Input 5 
5004.03 Coil 12  Not Used 
5004.04 Coil 13  Not Used 
5004.05 Coil 14  Operation Status 
5004.06 Coil 15  Rotation Direction 
5004.07 Coil 16  Inverter Ready 
5004.08 Coil 1  Run Commands 
5004.09 Coil 2  Rotation Direction Command 
5004.10 Coil 3  External Trip (EXT) 
5004.11 Coil 4  Trip Reset (RS) 
5004.12 Coil 5  Not Used 
5004.13 Coil 6  Not Used 
5004.14 Coil 7  Multi‐Function Input 1 
5004.15 Coil 8  Multi‐Function Input 2 
5005.00 Coil 25  Signal During Run 
5005.01 Coil 26  Not Used 
5005.02 Coil 27  Data Writing 
5005.03 Coil 28  CRC Error 
5005.04 Coil 29  Overrun Error 
5005.05 Coil 30  Framing Error 
5005.06 Coil 31  Parity Error 
5005.07 Coil 32  Checksum Error 
5005.08 Coil 17  Not Used 
5005.09 Coil 18  Not Used 
5005.10 Coil 19  Not Used 
5005.11 Coil 20  Alarm Signal 
5005.12 Coil 21  Excessive PID Deviation Signal 
5005.13 Coil 22  Overload Warning 
5005.14 Coil 23  Frequency Arrival Signal (Over Set Frequency) 
5005.15 Coil 24  Frequency Arrival Signal (Constant Speed) 
Revision History

Date Notes Version


6/8/2009 Original Document 1.50
6/11/2009 Added CJ1/CS1/CJ2 2.00
Added Memory Layout for Functions
Corrected Error in 3G3JX Memory Example
6/18/2009 Changed PMCR timeout to 300 ms from 1 sec 2.05
Added ‘No Read Items’ option

You might also like