ScriptAuthor "Deutschmann Automation GmbH" ScriptName "Modbus-RTU (Master)" ScriptVersion "V 1.0" // This script realized the Modbus-RTU-MASTER function // described in UNIGATE Manual // 27.01.03 St angepast auf PD V2.0, bug Modbus RxLen Returnvalue // Bufferlength must be max. Fieldbus-Length // For this example = 32 Byte Var BusInput : BUFFER[32] ; // 32=max.Fieldbus-Length Var BusOutput : BUFFER[32] ; // 32=max.Fieldbus-Length Var wBusInputLen: Word ; Var wBusOutputLen: Word ; Var bBusInputLen: Byte ; Var bBusOutputLen: Byte ; Var Timeout_ms: Word ; Var ModbusRxLen: Word ; Var ReturnCode: Byte ; Var NoError: Byte ; Var w_one: Word ; MoveConst (w_one, 1) ; MoveConst (Timeout_ms , 0) ; // No timeout-check MoveConst (NoError, 0) ; // Returncode 0 = No Error // Init serial port Set ( Baudrate , 19200 ) ; Set ( Databits , 8 ) ; Set ( Startbits , 1 ) ; Set ( Stopbits , 1 ) ; Set ( Parity , even ) ; Set ( ModbusRTUTimeout , 250 ) ; // 250ms Set ( RS_State_LED , RedGreenFlashing ) ; // Start Bus and wait until running BusStart ; Wait ( Bus_Active ) ; Set ( RS_State_LED , GreenFlashing ) ; // Read actual Bus-Input und -Output-Length Get ( BusInputSize , bBusInputLen ) ; Get ( BusOutputSize , bBusOutputLen ) ; Copy ( bBusInputLen , wBusInputLen , w_one ) ; Copy ( bBusOutputLen , wBusOutputLen , w_one ) ; :WaitNewBusData ; // Wait without timeout for changed Busdata WaitBusDataChanged ( Timeout_ms , wBusInputLen ) ; ReadBus ( BusInput[0] , wBusInputLen ) ; // Received Busdata will be send by Modbus // Then wait for Modbus answer ExchangeModbusRTUMaster ( BusInput[0], BusOutput[0], ModbusRxLen ) ; // Check Returncode for Modbus-Error Get ( ErrorCode , ReturnCode ) ; if ReturnCode equal NoError then :CopyModbusDataToBus else :ModbusError ; :CopyModbusDataToBus ; Set ( Errorcode , 0 ) ; // Clear Error-LEDs // Send received Modbus-Data to fieldbus WriteBus ( BusOutput[0] , wBusOutputLen ) ; Set ( RS_State_LED , StaticGreen ) ; jump :WaitNewBusData ; :ModbusError ; // RS-LED static red, Yellow-LED blinking with "10" Set ( Errorcode , 10 ) ; jump :WaitNewBusData ;