====== Interfacing with the MOACON ======
Connect the ComfileHMI's RS-232 port to the MOACON's RS-232 port as illustrated below (The Mocaon supports Modbus RTU on channels 0, 1, and 2).
{{ :comfilehmi:hmi_connection_moacon:connectionmoacon.png?nolink |}}
{{ :comfilehmi:hmi_connection_moacon:dsc04034.png?nolink&500 |}}
Use the [[http://www.comfiletech.com/embedded-controller/moacon/accessories/rs232-terminal-contact/|RS232 Terminal Contact]] to make the connections.
{{ :comfilehmi:hmi_connection_moacon:dsc04033.png?nolink&500 |}}
\\
For RS-485, connect the ComfileHMI's RS-485 port to the MOACON's RS-485 port as illustrated below.
{{ :comfilehmi:hmi_connection_moacon:rs485.png?nolink |}}
===== ComfileHMI's Communication Settings ======
When creating a new project, select the //COMFILE// and //MOACON// protocols.
{{ :comfilehmi:hmi_connection_moacon:eprj2.png?nolink |}}
In the ComfileHMI project, use the addressing scheme described here: https://en.wikipedia.org/wiki/Modbus#Modbus_object_types
====== Moacon Source Code ======
Please use the latest version of MOACON Studio.
The following minimal source code illustrates how to create a Modbus RTU slave on serial channel 0.
#include "moacon500.h"
void cmain(void)
{
static u8 MDcoil[100];
static u16 MDregister[100];
openCom(0,115200, C8N1); // RS232C Channel 0 at 115200bps
startModbusRtu(0,1,MDregister, MDcoil); // Start the Modbus RTU slave with slave address 1
delay(100);
for(;;) { } // Loop forever
}
* The above source code implements a Modbus RTU slave on the MOACON's serial channel 0. The ComfileHMI will therefore be the MOACON's master.
* The MOACON only supports 1 Modbus slave at a time regardless of the channel(s) used. Running two Modbus slaves on two different channels is not supported.
* If you experience communication problems between the MOACON and the ComfileHMI, please try the source above for troubleshooting. If there is a programming error in the MOACON source code, communication between the MOACON and the ComfileHMI can become problematic.
===== coil and coilSet Functions =====
The following functions are provided to make reading and writing individual bits in the Modbus coil region more convenient.
* coil(addr) : Read bit corresponding to a given Modbus address
* coilSet(addr, value) : Write bit corresponding to a given Modbus address
#include "moacon500.h"
static u8 MDcoil[100];
static u16 MDregister[100];
//
// Read a bit corresponding to a given Modbus address
// a = coil(9); // Bit corresponding to Modbus address 00009 is read
u8 MDbitDecode[8] = {1,2,4,8,16,32,64,128};
u8 coil(u16 MDBSadr)
{
MDBSadr--;
if (MDcoil[MDBSadr>>3] & MDbitDecode[MDBSadr & 7]) return 1;
return 0;
}
//
// Write bit corresponding to a given Modbus address
// coilSet(9,0); // Set bit corresponding to Modbus address 9 to 0
// coilSet(9,1); // Set bit corresponding to Modbus address 9 to 1
//
void coilSet(u16 MDBSadr, u8 MDBSdata)
{
u16 arrayindex;
MDBSadr--;
arrayindex = MDBSadr>>3; // The location in the array
if (MDBSdata==0)
{
MDcoil[arrayindex] &= ~MDbitDecode[MDBSadr & 7];
}
else
{
MDcoil[arrayindex] |= MDbitDecode[MDBSadr & 7];
}
}
void cmain(void)
{
openCom(0,115200, C8N1);
startModbusRtu(0,1,MDregister, MDcoil);
clcdI2cInit(0);
clcdPower(1);
delay(100);
portInit(3,0);
while(1)
{
MDregister[0]++; // Increment for verification on the ComfileHMI
MDcoil[0]++; // Update coils 1~8 and verify on the ComfileHMI
if (coil(17) != 0)
{
portOn(30);
}
else
{
portOff(30);
}
if (portIn(0)==0)
{
coilSet(18,0);
}
else
{
coilSet(18,1);
}
delay(1);
}
}
A video demonstrating this program can be found below.
====== Video Demonstration ======