i would like a little help.
I have the following code:
Code: Select all
#define STR( fieldname ) ((const char*)( fieldname ))
#define OPTS( min_val, max_val, step_val ) { .opt1 = min_val, .opt2 = max_val, .opt3 = step_val }
#define MASTER_CHECK( a, ret_val, str, ... ) \
if ( !( a ) ) { \
ESP_LOGE( TAG, "%s(%u): " str, __FUNCTION__, __LINE__, ##__VA_ARGS__ ); \
return ( ret_val ); \
}
// Enumeration of modbus slave addresses accessed by master device
enum {
MB_DEVICE_ADDR1 = 1,
MB_SLAVE_COUNT
};
// Enumeration of all supported CIDs for device
enum {
CID_STATUS = 0
};
static esp_err_t read_modbus_parameter( uint16_t cid, uint16_t *par_data ) {
const mb_parameter_descriptor_t* param_descriptor = NULL;
esp_err_t error_holder = mbc_master_get_cid_info( cid, ¶m_descriptor );
if ( ( error_holder != ESP_ERR_NOT_FOUND ) && ( param_descriptor != NULL ) ) {
uint8_t type = 0;
error_holder = mbc_master_get_parameter( cid, (char*)param_descriptor->param_key, (uint8_t*)par_data, &type );
if ( error_holder == ESP_OK ) {
ESP_LOGI(
TAG,
"Characteristic #%d %s (%s) value = (0x%04x) parameter read successful.",
param_descriptor->cid,
(char*)param_descriptor->param_key,
(char*)param_descriptor->param_units,
*(uint16_t*)par_data
);
} else {
ESP_LOGE(
TAG,
"Characteristic #%d %s (%s), parameter read fail.",
param_descriptor->cid,
(char*)param_descriptor->param_key,
(char*)param_descriptor->param_units
);
}
}
return error_holder;
}
static void master_read( void *parameters ) {
esp_err_t error_holder = ESP_OK;
uint16_t register_data = 0;
ESP_LOGI( TAG, "Start modbus test..." );
error_holder = read_modbus_parameter( CID_STATUS, ®ister_data );
if ( error_holder != ESP_OK ) {
ESP_LOGE( TAG, "mb read holder fail, err=%x.", error_holder );
}
ESP_LOGI( TAG, "Modbus test is completed." );
}
// Modbus master initialization
static esp_err_t master_init( void ) {
esp_err_t error_holder = ESP_OK;
// Example Data Dictionary for Modbus parameters in 1 slave in the segment
mb_parameter_descriptor_t device_parameters[] = {
{
CID_STATUS, /* CID */
STR( "Status" ), /* Name */
STR( "x" ), /* Units */
MB_DEVICE_ADDR1, /* Modbus Address */
MB_PARAM_HOLDING, /* Register Type */
32089, /* Modbus Reg Start Address */
1, /* Modbus Reg Read Length */
0, /* Instance Offset (NA) */
PARAM_TYPE_U16, /* Instance Type */
1, /* Instance Length (bytes) */
OPTS( 0, 0, 0 ), /* Options (NA) */
PAR_PERMS_READ_TRIGGER /* Permissions */
}
};
// Calculate number of parameters in the table
const uint16_t num_device_parameters = ( sizeof( device_parameters ) / sizeof( device_parameters[ 0 ] ) );
void* master_handler = NULL; // Pointer to allocate interface structure
// Initialization of Modbus slave for TCP
error_holder = mbc_master_init_tcp( &master_handler );
if ( master_handler == NULL || error_holder != ESP_OK ) {
ESP_LOGE( TAG, "mb controller initialization fail." );
}
char* slave_ip_address_table[ 2 ] = { "192.168.1.186", NULL };
mb_communication_info_t comm_info = {
.ip_port = 502,
.ip_addr_type = MB_IPV4,
.ip_mode = MB_MODE_TCP,
.ip_addr = slave_ip_address_table,
.ip_netif_ptr = s_esp_netif
};
ESP_ERROR_CHECK( mbc_master_setup( (void*)&comm_info ) );
ESP_ERROR_CHECK( mbc_master_set_descriptor( &device_parameters[ 0 ], num_device_parameters ) );
ESP_LOGI( TAG, "Set Descriptor" );
vTaskDelay( 1000 / portTICK_PERIOD_MS );
error_holder = mbc_master_start();
if ( error_holder != ESP_OK ) {
ESP_LOGE( TAG, "mb controller start fail, err=%x.", error_holder );
}
ESP_LOGI( TAG, "Start Modbus Master" );
vTaskDelay( 1000 / portTICK_PERIOD_MS );
error_holder = mbc_master_set_descriptor( &device_parameters[ 0 ], num_device_parameters );
MASTER_CHECK( ( error_holder == ESP_OK ), ESP_ERR_INVALID_STATE, "mb controller set descriptor fail, returns(0x%x).", (uint32_t)error_holder );
vTaskDelay( 1000 / portTICK_PERIOD_MS );
ESP_LOGI( TAG, "Modbus master stack initialized..." );
return error_holder;
}
0;32mI (2107) Modbus Power: Initializing Modbus Master
0;32mI (2107) Modbus Power: Set Descriptor
0;32mI (3107) MB_TCP_MASTER_PORT: TCP master stack initialized.
0;32mI (3107) MB_TCP_MASTER_PORT: Host[IP]: "192.168.1.186"[192.168.1.186]
0;32mI (3107) MB_TCP_MASTER_PORT: Add slave IP: 192.168.1.186
0;32mI (3107) MB_TCP_MASTER_PORT: Connecting to slaves...
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
I made a Python script which is working fine:
Code: Select all
client = ModbusClient( '192.168.101.186', port = 502, unit_id = 0 )
client_connection = client.connect()
time.sleep( 1 )
if client_connection:
try:
device_status_register = client.read_holding_registers( 0x7D59, 0x01, unit = 1 )
except Exception:
print( 'Exception' )
else:
print( 'Device Status:', type_status( device_status_register.registers[ 0 ] ) )
finally:
client.close()
Thank you for your time.