ScriptName "Example RS IC ModbusMaster" ScriptAuthor "(dA) " ScriptVersion "V 1.0" // V 1.0 21.02.05 erzeugt // Transparenter data exchange RS-interface <-> ModbusMasterRTU fieldbus RS SetErrorHandler ( :AddressError ) ; // see Help - Index - Inhalt - Appendix - Return Codes ! SetSystemErrorHandler ( :AddressSysError ) ; Var aBusInBuf : BUFFER [12]; // max 512 Byte for RS IC Var aBusInBufRes : BUFFER [500]; // Var aBusOutBuf : BUFFER [12]; // " Var aBusOutBufRes : BUFFER [500]; // Var aRSInBuf : BUFFER [100]; // " var RxSync : buffer [2]; // shift register input buffer var wBusInSize : word ; var wBusOutSize : word ; var wtemp : word ; var w0 : word ; moveconst ( w0, 0) ; var w1 : word ; moveconst ( w1, 1) ; var w2 : word ; moveconst ( w2, 2) ; var TimeOut : word ; moveconst ( TimeOut, 10) ; // Timeout var bBusInSize : byte ; var b0 : byte ; moveconst ( b0 , 0 ) ; var b2 : byte ; moveconst ( b2 , 2 ) ; var b16 : byte ; moveconst ( b16 , 16 ) ; var bErrorHandler : byte ; var bSysErrorHandler : byte ; var LastbSysErrorHandler : byte ; var bErrorCode : byte ; var hFF : byte ; moveconst ( hFF , 0xFF ) ; var hFE : byte ; moveconst ( hFE , 0xFE ) ; var hFD : byte ; moveconst ( hFD , 0xFD ) ; var hFB : byte ; moveconst ( hFB , 0xFB ) ; var hF7 : byte ; moveconst ( hF7 , 0xF7 ) ; //var hEF : byte ; moveconst ( hEF , 0xEF ) ; var hDF : byte ; moveconst ( hDF , 0xDF ) ; var hBF : byte ; moveconst ( hBF , 0xBF ) ; //var h7F : byte ; moveconst ( h7F , 0x7F ) ; var w7F : word ; moveconst ( w7F , 0x7F ) ; //********** RS interface init ************************************************* //Set ( Baudrate , 9600 ) ; // all default //Set ( Databits , 8 ) ; //Set ( Startbits , 1 ) ; //Set ( Parity , none ) ; //Set ( RS_Type , RS232 ) ; //********** init 2. RS interface (fieldbus) *********************************** Set ( BusBaudrate , 57600 ) ; // 9600 = default //Set ( FBRS_ANZ_DAT_BITS , 8 ) ; // 8 = default //Set ( FBRS_ANZ_STOP_BITS , 1 ) ; // 1 = default //Set ( FBRS_PARITY , 0 ) ; // PARITY_NO 0 default // PARITY_ODD 1 // PARITY_EVEN 2 // PARITY_MARK 3 /* Paritybit immer 1 */ // PARITY_SPACE 4 /* Paritybit immer 0 */ Set ( FBRS_TYPE , 2 ) ; // RS_TYP_232 0x01 default // RS_TYP_485 0x02 // RS_TYP_422 0x03 //*************** Modbus Master Parameter ************************************** Set ( ModbusRTUTimeout , 200 ) ; // Timeout for the Modbus Slave answer into ms //********** shift-register init *********************************************** Set ( ShiftRegisterInputType , RiseClock_LowLoad ) ; Set ( ShiftRegisterOutputType , RiseClock_RiseLoad ) ; Set ( ShiftRegisterInputBitLength , 16 ) ; Set ( ShiftRegisterOutputBitLength , 8 ) ; //********** read dip-switch *************************************************** ReadShiftRegister ( RxSync[0] ) ; // read switch: // 1.Byte FB: H-Nibble=L-Address(right), L-Nibble=H-Address(left) // 2.Byte RS: H-Nibble=L-Address(right), L-Nibble=H-Address(left) //********** show LEDīs ******************************************************** WriteShiftRegister ( hFF ) ; // 0 //WriteShiftRegister ( hFE ) ; // 1 //WriteShiftRegister ( hFD ) ; // 2 //WriteShiftRegister ( hFB ) ; // 3 //WriteShiftRegister ( hF7 ) ; // 4 //WriteShiftRegister ( h7F ) ; // RS State rt => 7 = 7d = 0111 xxxx //WriteShiftRegister ( hBF ) ; // RS State gn => B = 11d = 1011 xxxx //WriteShiftRegister ( hDF ) ; // FB State gn => D = 13d = 1101 xxxx //WriteShiftRegister ( hEF ) ; // FB State rt => E = 14d = 1110 xxxx //*********** start 2.RS interface (fieldbus) ********************************* BusStart ; Wait ( Bus_Active ) ; WriteShiftRegister ( hDF ) ; // FB State gn //********************* main *************************************************** :start ; FBRSExchangeModbusRTUMaster ( aBusOutBuf[0] , aBusInBuf[0] , bBusInSize ) ; if bBusInSize equal b0 then :CheckRS_In; WriteShiftRegister ( hDF ) ; // FB State gn Convert ( bBusInSize , Byte , wBusInSize , Word ) ; SendRS ( aBusInBuf[0] , wBusInSize ) ; :CheckRS_In; moveconst (wBusOutSize, 0); ReceiveSomeCharRS( TimeOut, aRSInBuf[0], w1 ); Get ( ErrorCode , bErrorCode ) ; if bErrorCode equal b2 then :write_bus; // else :storeData ; CopyIndexed ( w1 , aRSInBuf[0] , w0 , aBusOutBuf[0] , wBusOutSize ) ; CalculateByte ( wBusOutSize , w1 , add , wBusOutSize ) ; call :SetRSgn; // WriteShiftRegister ( hBF ) ; // RS State gn jump :CheckRS_In; :write_bus; if wBusOutSize equal w0 then :CheckRS_In; jump :start; //******************* end ****************************************************** //******************* call - subroutine **************************************** :SetRSgn; if LastbSysErrorHandler notequal b0 then :SetRSgnEnd; WriteShiftRegister ( hBF ) ; // RS State gn :SetRSgnEnd; return; //******************* ir - ErrorHandler - subroutine *************************** :AddressError ; Get ( ErrorCode , bErrorHandler ) ; // see Help - Index - Inhalt - Appendix - Return Codes ! // TBD user evaluation for the value of Errorcode return ; //******************* ir - System-ErrorHandler - subroutine ******************** :AddressSysError; Get ( systemError , bSysErrorHandler ) ; // see manuel(uni_pb_e.pdf) // Table 2: Error handling at UNIGATE SC // note: ErrorNo 9(RS-time out) is not eccured // after the Timout of "ReceiveSomeCharRS" or ReceiveSpecialCharRS Copy ( bSysErrorHandler, LastbSysErrorHandler, w1); if bSysErrorHandler less b16 then :SysErrorOK; moveconst ( bSysErrorHandler, 0x70); // rt 15 jump :SetShiftOut; :SysErrorOK; if bSysErrorHandler notequal b0 then :SetErrorLED; moveconst ( bSysErrorHandler, 0xBF); // gn 0 jump :SetShiftOut; :SetErrorLED; Convert ( bSysErrorHandler , Byte , wtemp , Word ) ; CalculateByte ( w7F , wtemp , sub , wtemp ) ; Convert ( wtemp , Word, bSysErrorHandler , Byte ) ; :SetShiftOut; WriteShiftRegister ( bSysErrorHandler ) ; return;