|
|
@ -15,6 +15,31 @@
|
|
|
|
/* Private variables ---------------------------------------------------------*/
|
|
|
|
/* Private variables ---------------------------------------------------------*/
|
|
|
|
modbus_t modbus;
|
|
|
|
modbus_t modbus;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void _modbus_show(void)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
card_t *pcard = modbus.card;
|
|
|
|
|
|
|
|
printh("ID ST IN CO M S\r\n");
|
|
|
|
|
|
|
|
for (int slot = 0; slot < PD_SLOTS_MAX; slot++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
printh("%-02d %-02d %-02d %-02d %d %d\r\n", pcard->unit_id, pcard->status,
|
|
|
|
|
|
|
|
pcard->is_insert, pcard->is_connect, pcard->type_m, pcard->type_s);
|
|
|
|
|
|
|
|
pcard++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* modbus 状态显示 */
|
|
|
|
|
|
|
|
CMD(modbus_show,
|
|
|
|
|
|
|
|
modbus_show_cmd,
|
|
|
|
|
|
|
|
"show modbus",
|
|
|
|
|
|
|
|
"Show\n"
|
|
|
|
|
|
|
|
"Modbus\n")
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
_modbus_show();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int32_t _modbus_tcp_transaction(uint16_t transaction_id, uint8_t unit_id, uint16_t start_addr, uint16_t data_num)
|
|
|
|
int32_t _modbus_tcp_transaction(uint16_t transaction_id, uint8_t unit_id, uint16_t start_addr, uint16_t data_num)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int txlen = 0;
|
|
|
|
int txlen = 0;
|
|
|
@ -44,8 +69,9 @@ int32_t _modbus_tcp_transaction(uint16_t transaction_id, uint8_t unit_id, uint16
|
|
|
|
DBG(DBG_M_PD_MODBUS_ERR, "Modbus write error\r\n");
|
|
|
|
DBG(DBG_M_PD_MODBUS_ERR, "Modbus write error\r\n");
|
|
|
|
return E_ERROR;
|
|
|
|
return E_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
DBG(DBG_M_PD_MODBUS, "Modbus write len = %d\r\n", txlen);
|
|
|
|
|
|
|
|
buf_print((char *)modbus.txbuf, txlen);
|
|
|
|
//DBG(DBG_M_PD_MODBUS, "Modbus write len = %d\r\n", txlen);
|
|
|
|
|
|
|
|
//buf_print((char *)modbus.txbuf, txlen);
|
|
|
|
|
|
|
|
|
|
|
|
// 等待传输完成
|
|
|
|
// 等待传输完成
|
|
|
|
usleep(13000); // 13000
|
|
|
|
usleep(13000); // 13000
|
|
|
@ -54,13 +80,19 @@ int32_t _modbus_tcp_transaction(uint16_t transaction_id, uint8_t unit_id, uint16
|
|
|
|
rxlen = serial_read(modbus.fd, modbus.rxbuf, sizeof(modbus.rxbuf));
|
|
|
|
rxlen = serial_read(modbus.fd, modbus.rxbuf, sizeof(modbus.rxbuf));
|
|
|
|
if (rxlen > 0)
|
|
|
|
if (rxlen > 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
DBG(DBG_M_PD_MODBUS, "Modbus read len = %d\r\n", rxlen);
|
|
|
|
uint16_t length;
|
|
|
|
buf_print((char *)modbus.rxbuf, rxlen);
|
|
|
|
//DBG(DBG_M_PD_MODBUS, "Modbus read len = %d\r\n", rxlen);
|
|
|
|
uint16_t trans_id = (modbus.rxbuf[0] << 8) + modbus.rxbuf[1];
|
|
|
|
//buf_print((char *)modbus.rxbuf, rxlen);
|
|
|
|
if (trans_id == transaction_id
|
|
|
|
|
|
|
|
&& modbus.rxbuf[POS_UINT_ID] == unit_id)
|
|
|
|
length = modbus.rxbuf[POS_DATA_LEN] << 8;
|
|
|
|
|
|
|
|
length += modbus.rxbuf[POS_DATA_LEN + 1];
|
|
|
|
|
|
|
|
if (rxlen == length + 6)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return E_NONE;
|
|
|
|
uint16_t trans_id = (modbus.rxbuf[0] << 8) + modbus.rxbuf[1];
|
|
|
|
|
|
|
|
if (trans_id == transaction_id && modbus.rxbuf[POS_UINT_ID] == unit_id)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return E_NONE;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -102,15 +134,13 @@ int32_t _modbus_rtu_transaction(void)
|
|
|
|
return E_NONE;
|
|
|
|
return E_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int32_t _modbus_get_device_type(uint8_t unit, uint16_t *type)
|
|
|
|
int32_t _modbus_get_device_type(uint8_t unit, uint8_t *typem, uint8_t *types)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
uint16_t device_type = 0;
|
|
|
|
|
|
|
|
if (!_modbus_tcp_transaction(5, unit, MODBUS_DEVICE_TYPE_ADDR, 1))
|
|
|
|
if (!_modbus_tcp_transaction(5, unit, MODBUS_DEVICE_TYPE_ADDR, 1))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
device_type = modbus.rxbuf[9] << 8;
|
|
|
|
*typem = modbus.rxbuf[9];
|
|
|
|
device_type += modbus.rxbuf[10];
|
|
|
|
*types = modbus.rxbuf[10];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*type = device_type;
|
|
|
|
|
|
|
|
return E_NONE;
|
|
|
|
return E_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -129,17 +159,16 @@ int32_t _modbus_get_current(uint8_t unit, uint16_t addr, uint16_t len, uint32_t
|
|
|
|
return E_NONE;
|
|
|
|
return E_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void _modbus_read_slot_stat(stat_t *pstat)
|
|
|
|
void _modbus_read_slot_stat(card_t *pcard)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
stat_t *ptmp = pstat;
|
|
|
|
card_t *ptmp = pcard;
|
|
|
|
for (int slot = 0; slot < MAX_SLOT; slot++)
|
|
|
|
for (int slot = 0; slot < PD_SLOTS_MAX; slot++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//pstat[slot].status = 0;
|
|
|
|
|
|
|
|
ptmp->status = 0;
|
|
|
|
ptmp->status = 0;
|
|
|
|
ptmp++;
|
|
|
|
ptmp++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ptmp = pstat;
|
|
|
|
ptmp = pcard;
|
|
|
|
gpio_val_get(gpio_dau1_idx, &ptmp->status);
|
|
|
|
gpio_val_get(gpio_dau1_idx, &ptmp->status);
|
|
|
|
ptmp++;
|
|
|
|
ptmp++;
|
|
|
|
gpio_val_get(gpio_dau2_idx, &ptmp->status);
|
|
|
|
gpio_val_get(gpio_dau2_idx, &ptmp->status);
|
|
|
@ -156,7 +185,7 @@ void _modbus_read_slot_stat(stat_t *pstat)
|
|
|
|
|
|
|
|
|
|
|
|
void *_modbus_send_handle()
|
|
|
|
void *_modbus_send_handle()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
stat_t *pstat = NULL;
|
|
|
|
card_t *pcard = NULL;
|
|
|
|
while (1)
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
#if 0
|
|
|
|
#if 0
|
|
|
@ -173,28 +202,31 @@ void *_modbus_send_handle()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#else
|
|
|
|
pstat = modbus.stat;
|
|
|
|
pcard = modbus.card;
|
|
|
|
_modbus_read_slot_stat(pstat);
|
|
|
|
_modbus_read_slot_stat(pcard);
|
|
|
|
|
|
|
|
|
|
|
|
for (int slot = 0; slot < MAX_SLOT; slot++)
|
|
|
|
for (int slot = 0; slot < PD_SLOTS_MAX; slot++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (pstat->status)
|
|
|
|
if (pcard->status)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_modbus_get_device_type(pstat->unit_id, &pstat->type);
|
|
|
|
_modbus_get_device_type(pcard->unit_id, &pcard->type_m, &pcard->type_s);
|
|
|
|
|
|
|
|
|
|
|
|
if (DEVICE_IR_TYPE == pstat->type)
|
|
|
|
if (DEVICE_IR_TYPE == pcard->type_s && DEVICE_M_TYPE == pcard->type_m)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_modbus_get_current(pstat->unit_id,
|
|
|
|
pcard->is_connect = TRUE;
|
|
|
|
MODBUS_IR_CURRENT_ADDR, MODBUS_IR_CURRENT_LEN, &pstat->current);
|
|
|
|
_modbus_get_current(pcard->unit_id,
|
|
|
|
DBG(DBG_M_PD_MODBUS, "current:%d\n", pstat->current);
|
|
|
|
MODBUS_IR_CURRENT_ADDR, MODBUS_IR_CURRENT_LEN, &pcard->current);
|
|
|
|
|
|
|
|
//DBG(DBG_M_PD_MODBUS, "current:%d\n", pcard->current);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (DEVICE_DC_TYPE == pstat->type)
|
|
|
|
else if (DEVICE_DC_TYPE == pcard->type_s && DEVICE_M_TYPE == pcard->type_m)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_modbus_get_current(pstat->unit_id,
|
|
|
|
pcard->is_connect = TRUE;
|
|
|
|
MODBUS_DC_CURRENT_ADDR, MODBUS_DC_CURRENT_LEN, &pstat->current);
|
|
|
|
_modbus_get_current(pcard->unit_id,
|
|
|
|
|
|
|
|
MODBUS_DC_CURRENT_ADDR, MODBUS_DC_CURRENT_LEN, &pcard->current);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pstat++;
|
|
|
|
|
|
|
|
|
|
|
|
pcard++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
@ -211,11 +243,13 @@ void *_modbus_send_handle()
|
|
|
|
int32_t modbus_handle_init(void)
|
|
|
|
int32_t modbus_handle_init(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
memset(&modbus, 0, sizeof(modbus));
|
|
|
|
memset(&modbus, 0, sizeof(modbus));
|
|
|
|
for (int slot = 0; slot < MAX_SLOT; slot++)
|
|
|
|
for (int slot = 0; slot < PD_SLOTS_MAX; slot++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
modbus.stat[slot].unit_id = slot + 1;
|
|
|
|
modbus.card[slot].unit_id = slot + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
modbus.fd = -1;
|
|
|
|
modbus.fd = -1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cmd_install_element(COMMON_NODE, &modbus_show_cmd);
|
|
|
|
return E_NONE;
|
|
|
|
return E_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -232,7 +266,6 @@ int32_t modbus_handle_init_after(void)
|
|
|
|
return E_ERROR;
|
|
|
|
return E_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
modbus.fd = fd;
|
|
|
|
modbus.fd = fd;
|
|
|
|
DBG(DBG_M_PD_MODBUS, "fd=%d\n", modbus.fd);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
param.arg = NULL;
|
|
|
|
param.arg = NULL;
|
|
|
|
param.priority = 80;
|
|
|
|
param.priority = 80;
|
|
|
|