// gfambrtumst.h : // #if !defined(AGD_GFAMBRTUMST_H__F97088DB_3E1B_4FC8_A313_476634890514__INCLUDED_) #define AGD_GFAMBRTUMST_H__F97088DB_3E1B_4FC8_A313_476634890514__INCLUDED_ #include #include #ifdef __cplusplus extern "C" { #endif // __cplusplus ///////////////////////////////////////////////////////////////////////////// // mbrtumast.h - Declarations: typedef void *HMBRTUMST; ///////////////////////////////////////////////////////////////////////////// // error codes #define GFA_MB_MST_ERROR_INVALID_SLAVE_ID 0x0001 #define GFA_MB_MST_ERROR_INVALID_FUNCTION 0x0002 #define GFA_MB_MST_ERROR_SLAVE_ERROR 0x0003 #define GFA_MB_MST_ERROR_SLAVE_RESPONSE_TIMEOUT 0x0004 #define GFA_MB_MST_ERROR_SLAVE_CHAR_TIMEOUT 0x0005 #define GFA_MB_MST_ERROR_SLAVE_INVALID_CRC 0x0006 #define GFA_MB_MST_ERROR_SLAVE_INVALID_DATA 0x0007 #define GFA_MB_MST_ERROR_UNEXPECTED 0xFFFF ///////////////////////////////////////////////////////////////////////////// typedef enum _GFA_MODBUS_RTU_MST_STATES { MB_RTU_MST_Void = -1, MB_RTU_MST_Idle, MB_RTU_MST_TxStart, MB_RTU_MST_TxWaitEnd, MB_RTU_MST_TxDone, MB_RTU_MST_WaitRxFifo, MB_RTU_MST_RxSlvID, MB_RTU_MST_RxFunc, MB_RTU_MST_RxData, MB_RTU_MST_RxError, MB_RTU_MST_RxCRC, MB_RTU_MST_RxFinalize, MB_RTU_MST_ReportError }GFA_MODBUS_RTU_MST_STATES; ///////////////////////////////////////////////////////////////////////////// typedef void (*PFN_GFA_RAW_REQUEST_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam); typedef void (*PFN_GFA_READ_REGISTERS_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, const uint16_t *pRegs, size_t nRegCount); typedef void (*PFN_GFA_PRESET_SINGLE_REGISTER_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err); typedef void (*PFN_GFA_WRITE_REGISTERS_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nRegStart, uint16_t nRegsWritten); typedef void (*PFN_GFA_DIAGNOSIS_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nSubFunc, uint16_t nData); typedef void (*PFN_GFA_REPORT_SLAVE_ID_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, const void *pData, size_t nCbData); ///////////////////////////////////////////////////////////////////////////// typedef void (*PFN_GFA_MASTER_STATE_CHANGED) (GFA_MODBUS_RTU_MST_STATES newState, GFA_MODBUS_RTU_MST_STATES oldState); typedef void (*PFN_GFA_MASTER_PRE_TRANSMIT) (uint32_t nTID, uint8_t nSlvID); typedef void (*PFN_GFA_MASTER_POST_TRANSMIT) (uint32_t nTID, uint8_t nSlvID); typedef void (*PFN_GFA_MASTER_RECEIVE_START) (uint32_t nTID); typedef void (*PFN_GFA_MASTER_RECEIVE_END) (uint32_t nTID); typedef struct _GFA_MODBUS_MASTER_APP_INTERFACE { PFN_GFA_MASTER_STATE_CHANGED pfnStateChanged; PFN_GFA_MASTER_PRE_TRANSMIT pfnPreTx; PFN_GFA_MASTER_POST_TRANSMIT pfnPostTx; PFN_GFA_MASTER_RECEIVE_START pfnRxStart; PFN_GFA_MASTER_RECEIVE_END pfnRxEnd; }GFA_MODBUS_MASTER_APP_INTERFACE, *LPGFA_MODBUS_MASTER_APP_INTERFACE; typedef const GFA_MODBUS_MASTER_APP_INTERFACE *LPCGFA_MODBUS_MASTER_APP_INTERFACE; ///////////////////////////////////////////////////////////////////////////// typedef struct _GFA_MODBUS_RTU_MASTER_PARAMETERS { HFIFO hFifoRX; HFIFO hFifoTX; uint64_t nRxTimeoutUs; GFA_MODBUS_PROTOCOL_TIMEOUTS mpt; GFA_MODBUS_MASTER_APP_INTERFACE appItf; }GFA_MODBUS_RTU_MASTER_PARAMETERS, *LPGFA_MODBUS_RTU_MASTER_PARAMETERS; typedef const GFA_MODBUS_RTU_MASTER_PARAMETERS *LPCGFA_MODBUS_RTU_MASTER_PARAMETERS; ///////////////////////////////////////////////////////////////////////////// HMBRTUMST GfaModbusRTUMstCreate(LPCGFA_MODBUS_RTU_MASTER_PARAMETERS pmap); void GfaModbusRTUMstRelease(HMBRTUMST hMbMst); bool GfaModbusRTUMstStateMachine(HMBRTUMST hMbMst); bool GfaModbusRTUMstSendRawRequest(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint8_t nFunc, const void *pData, size_t nCbData, size_t nCbDataExpected, PFN_GFA_RAW_REQUEST_COMPLETE pfnRawReqComplete, void *pParam); bool GfaModbusRTUMstReadHoldingRegisters(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegStart, uint16_t nRegCount, PFN_GFA_READ_REGISTERS_COMPLETE pfnReadRegsComplete); bool GfaModbusRTUMstReadInputRegisters(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegStart, uint16_t nRegCount, PFN_GFA_READ_REGISTERS_COMPLETE pfnReadRegsComplete); bool GfaModbusRTUMstWriteMultipleRegisters(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegStart, uint16_t nRegCount, const void *pRegData, PFN_GFA_WRITE_REGISTERS_COMPLETE pfnWriteRegsComplete); bool GfaModbusRTUMstPresetSingleRegister(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nRegAddr, uint16_t nRegVal, PFN_GFA_PRESET_SINGLE_REGISTER_COMPLETE pfnPresetRegComplete); bool GfaModbusRTUMstDiagnosis(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint16_t nSubFunc, uint16_t nData, PFN_GFA_DIAGNOSIS_COMPLETE pfnDiagComplete); bool GfaModbusRTUMstReportSlaveID(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, size_t nCbDataExpected, PFN_GFA_REPORT_SLAVE_ID_COMPLETE pfnRepSlvIDComplete); ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Metronik support /* * * ACHTUNG: * Befindet sich der Sensors am Bus mit anderen Teilnehmern führt ein Pollen der Slaves mit einem Frame-Delay < 10 ms zu Timeout-Problemen des Sensors! * */ #define GFA_MB_ILM_FUNC_READ_UV ((uint8_t)0x41) #define GFA_MB_ILM_FUNC_READ_TEMP ((uint8_t)0x42) #define GFA_MB_ILM_FUNC_UNLOCK ((uint8_t)0x43) #define GFA_MB_ILM_FUNC_NEW_ADDR ((uint8_t)0x44) #define GFA_MB_ILM_FUNC_READ_RANGE ((uint8_t)0x45) #define GFA_MB_ILM_FUNC_READ_SERIAL ((uint8_t)0x46) ///////////////////////////////////////////////////////////////////////////// typedef void (*PFN_GFA_ILM_READ_UV_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nVal); typedef void (*PFN_GFA_ILM_READ_TEMP_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, uint8_t nVal); typedef void (*PFN_GFA_ILM_READ_UNLOCK_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, uint8_t nVal); typedef void (*PFN_GFA_ILM_NEW_ADDR_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, uint8_t nVal); typedef void (*PFN_GFA_ILM_READ_RANGE_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, uint16_t nVal); typedef void (*PFN_GFA_ILM_READ_SERIAL_COMPLETE) (uint32_t nTID, uint8_t nSlvID, uint16_t err, const uint8_t *pVal, size_t nCbVal); ///////////////////////////////////////////////////////////////////////////// bool GfaModbusRTUMstILMReadUV(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_UV_COMPLETE pfnReadUvComplete); bool GfaModbusRTUMstILMReadTemp(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_TEMP_COMPLETE pfnReadTempComplete); bool GfaModbusRTUMstILMUnlock(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_UNLOCK_COMPLETE pfnUnlockComplete); bool GfaModbusRTUMstILMReadRange(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_RANGE_COMPLETE pfnReadRangeComplete); bool GfaModbusRTUMstILMReadSerial(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_SERIAL_COMPLETE pfnReadSerialComplete); /* * GfaModbusRTUMstILMNewAddr: Weist dem Sensor eine neue Slave-Adresse zu. * Achtung: Der Sensor antwortet bei Erfolg bereits mit der neuen Slave-Adresse im Antwort-Frame!!! * Der Master ruft im Anschluss die Completion-Funktion mit dem Fehlercode GFA_MB_MST_ERROR_INVALID_SLAVE_ID (1) auf! * Die neue Slave-Adresse wurde in diesem Fall aber erfolgreich im Slave gesetzt! * * Achtung: Der Sensor akzeptiert die Broadcast-Adresse 0 als Slave-ID!!!! Diese sollte niemals gesetzt werden! */ bool GfaModbusRTUMstILMNewAddr(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint8_t nNewAddr, PFN_GFA_ILM_NEW_ADDR_COMPLETE pfnNewAddrComplete); ///////////////////////////////////////////////////////////////////////////// #ifdef __cplusplus } #endif // __cplusplus #endif // !defined(AGD_GFAMBRTUMST_H__F97088DB_3E1B_4FC8_A313_476634890514__INCLUDED_)