#include #include #include #include #include #include #include ///////////////////////////////////////////////////////////////////////////// static void _OnRawReadUvComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam) { PFN_GFA_ILM_READ_UV_COMPLETE pfnReadUvComplete = (PFN_GFA_ILM_READ_UV_COMPLETE)pParam; uint16_t nData = 0; if(err) { if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu) err |= ((uint16_t)padu->pdu.b[0] << 8); } else { nData = GfaBufGetUnaligned_uint16(padu->pdu.b); } (*pfnReadUvComplete)(nTID, nSlvID, err, nData); } ///////////////////////////////////////////////////////////////////////////// static void _OnRawReadTempComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam) { PFN_GFA_ILM_READ_TEMP_COMPLETE pfnReadTempComplete = (PFN_GFA_ILM_READ_TEMP_COMPLETE)pParam; uint8_t nData = 0; if(err) { if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu) err |= ((uint16_t)padu->pdu.b[0] << 8); } else { nData = padu->pdu.b[0]; } (*pfnReadTempComplete)(nTID, nSlvID, err, nData); } ///////////////////////////////////////////////////////////////////////////// static void _OnRawUnlockComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam) { PFN_GFA_ILM_READ_UNLOCK_COMPLETE pfnUnlockComplete = (PFN_GFA_ILM_READ_UNLOCK_COMPLETE)pParam; uint8_t nData = 0; if(err) { if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu) err |= ((uint16_t)padu->pdu.b[0] << 8); } else { nData = padu->pdu.b[0]; } (*pfnUnlockComplete)(nTID, nSlvID, err, nData); } ///////////////////////////////////////////////////////////////////////////// static void _OnRawNewAddrComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam) { PFN_GFA_ILM_NEW_ADDR_COMPLETE pfnNewAddrComplete = (PFN_GFA_ILM_NEW_ADDR_COMPLETE)pParam; uint8_t nData = 0; if(err) { if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu) err |= ((uint16_t)padu->pdu.b[0] << 8); } else { nData = padu->pdu.b[0]; } (*pfnNewAddrComplete)(nTID, nSlvID, err, nData); } ///////////////////////////////////////////////////////////////////////////// static void _OnRawReadRangeComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam) { PFN_GFA_ILM_READ_RANGE_COMPLETE pfnReadRangeComplete = (PFN_GFA_ILM_READ_RANGE_COMPLETE)pParam; uint16_t nData = 0; if(err) { if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu) err |= ((uint16_t)padu->pdu.b[0] << 8); } else { nData = GfaBufGetUnaligned_uint16(padu->pdu.b); } (*pfnReadRangeComplete)(nTID, nSlvID, err, nData); } ///////////////////////////////////////////////////////////////////////////// static void _OnRawReadSerialComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam) { PFN_GFA_ILM_READ_SERIAL_COMPLETE pfnReadSerialComplete = (PFN_GFA_ILM_READ_SERIAL_COMPLETE)pParam; const uint8_t *pData = NULL; size_t nData = 0; if(err) { if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu) err |= ((uint16_t)padu->pdu.b[0] << 8); } else { pData = padu->pdu.b; nData = nCbData; } (*pfnReadSerialComplete)(nTID, nSlvID, err, pData, nData); } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// bool GfaModbusRTUMstILMReadUV(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_UV_COMPLETE pfnReadUvComplete) { if(!pfnReadUvComplete) return false; return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_UV, NULL, 0, sizeof(uint16_t), _OnRawReadUvComplete, pfnReadUvComplete); } ///////////////////////////////////////////////////////////////////////////// bool GfaModbusRTUMstILMReadTemp(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_TEMP_COMPLETE pfnReadTempComplete) { if(!pfnReadTempComplete) return false; return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_TEMP, NULL, 0, sizeof(uint8_t), _OnRawReadTempComplete, pfnReadTempComplete); } ///////////////////////////////////////////////////////////////////////////// bool GfaModbusRTUMstILMUnlock(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_UNLOCK_COMPLETE pfnUnlockComplete) { uint8_t buf[] = {0x0C, 0x31}; if(!pfnUnlockComplete) return false; return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_UNLOCK, buf, sizeof(buf), sizeof(uint8_t), _OnRawUnlockComplete, pfnUnlockComplete); } ///////////////////////////////////////////////////////////////////////////// bool GfaModbusRTUMstILMNewAddr(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint8_t nNewAddr, PFN_GFA_ILM_NEW_ADDR_COMPLETE pfnNewAddrComplete) { if(nNewAddr == MODBUS_BROADCAST_ADDRESS || nNewAddr > MODBUS_MAX_SLAVE_ID) return false; if(!pfnNewAddrComplete) return false; return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_NEW_ADDR, &nNewAddr, sizeof(nNewAddr), sizeof(uint8_t), _OnRawNewAddrComplete, pfnNewAddrComplete); } ///////////////////////////////////////////////////////////////////////////// bool GfaModbusRTUMstILMReadRange(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_RANGE_COMPLETE pfnReadRangeComplete) { if(!pfnReadRangeComplete) return false; return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_RANGE, NULL, 0, sizeof(uint16_t), _OnRawReadRangeComplete, pfnReadRangeComplete); } ///////////////////////////////////////////////////////////////////////////// bool GfaModbusRTUMstILMReadSerial(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_SERIAL_COMPLETE pfnReadSerialComplete) { if(!pfnReadSerialComplete) return false; return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_SERIAL, NULL, 0, 5, _OnRawReadSerialComplete, pfnReadSerialComplete); }