//########################################## // Soft-PLC Demo //########################################## #include "rlthread.h" #include "rlplc.h" #include "rldataaquisition.h" // Siehe: // rlplc // rldataaquisition // rllib // definitions for PLC state variables enum IndexForIntValues { iiTest = 0, ioTest, MAX_INT }; enum IndexForFloatValues { fiTest = 0, MAX_FLOAT }; enum IndexForDoubleValues { diFest = 0, MAX_DOUBLE }; // our objects static rlPlcState state(MAX_INT, MAX_FLOAT, MAX_DOUBLE); static rlDataAquisition *modbus; //####################################################################### // helper functions for writeing outputs static void writeInt(int index, int slave, int adr) { char buf[80]; if(state.intChanged(index)) { sprintf(buf,"coil(%d,%d)", slave, adr); modbus->writeIntValue(buf, state.i[index]); } } //####################################################################### static void init() { #ifdef _WIN32 modbus = new rlDataAquisition("c:\\automation\\mbx\\modbus1.mbx", "c:\\automation\\shm\\modbus1.shm",65536); #else modbus = new rlDataAquisition("/srv/automation/mbx/modbus1.mbx", "/srv/automation/shm/modbus1.shm",65536); #endif } //####################################################################### static void readInputs() { state.i[iiTest] = modbus->intValue("coilStatus(1,0)"); } //####################################################################### static void writeOutputs() { writeInt(ioTest, 1, 1000); } //####################################################################### static void step() { if(state.hasBeenSet(iiTest,BIT1)) state.clear(ioTest,BIT0); else state.set (ioTest,BIT0); } //####################################################################### int main() { init(); while(1) { readInputs(); step(); writeOutputs(); state.rememberState(); rlsleep(100); } return 0; }