19.12.2012, 18:18 | #11 |
Junior Member
Регистрация: 19.12.2012
Адрес: Марбелья
Сообщений: 18
Вес репутации: 0 |
Сегодня, успешно завершил тест работы libmodbus
В качестве сервера работал роутер TP-Link TL-MR3220 v1, на котором установлен OpenWrt Attitude Adjustment 12.09-rc1.
libmodbus для роутера можно установить стандартными средствами (opkg install libmodbus) Тестовая программа (unit-test-client) собиралась стандартными средствами OpenWrt на Ubuntu. В качестве клиента работал LaunchPad MSP430 ( IDE energia-0101E0009 ), здесь работал немного модифицированный скетч из четвёрторо поста. Дело в том, что у LaunchPad есть два встроенных светодиода и датчик температуры. Вот их-то и задейсвовал. Slave ID = 1 Декларировано 10 регистров. Первый (0) и второй (1) регистр управляет включением-выключением светодиодов. Последний регистр (9) читает температуру процессора с встроенного термодатчика. В остальные регисры пишутся случайные числа. Исходник программы на C - Код:
#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <modbus.h> #include "unit-test.h" #define SL_ID 1 int main(int argc, char *argv[]) { uint16_t tab_reg[64]; modbus_t *ctx; int i, n , rc; ctx = modbus_new_rtu("/dev/ttyACM0", 9600, 'N', 8, 1); if (ctx == NULL) { fprintf(stderr, "Unable to allocate libmodbus context\n"); return -1; } modbus_set_debug(ctx, TRUE); modbus_set_error_recovery(ctx, MODBUS_ERROR_RECOVERY_LINK | MODBUS_ERROR_RECOVERY_PROTOCOL); modbus_set_slave(ctx, SL_ID); if (modbus_connect(ctx) == -1) { fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); modbus_free(ctx); return -1; } printf("** UNIT TESTING **\n"); printf("\nTEST WRITE/READ:\n"); tab_reg[0] = 0; tab_reg[1] = 1; for ( n=0 ; n<100 ; n++ ) { rc = modbus_read_registers(ctx, 0, 10, tab_reg); if (rc == -1) { fprintf(stderr, "%s\n", modbus_strerror(errno)); return -1; } for (i=0; i < rc; i++) { printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]); } if (tab_reg[0] == 1) tab_reg[0]=0; else tab_reg[0]=1; if (tab_reg[1] == 1) tab_reg[1]=0; else tab_reg[1]=1; tab_reg[2] = rand(); tab_reg[3] = rand(); tab_reg[4] = rand(); tab_reg[5] = rand(); tab_reg[6] = rand(); tab_reg[7] = rand(); tab_reg[8] = rand(); rc = modbus_write_registers(ctx, 0, 10, tab_reg); if (rc == -1) { fprintf(stderr, "%s\n", modbus_strerror(errno)); return -1; } for (i=0; i < rc; i++) { printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]); } sleep(1); } /* Close the connection */ modbus_close(ctx); modbus_free(ctx); return 0; } Код:
#include <Modbusino.h> const int ledPin_g = GREEN_LED; const int ledPin_r = RED_LED; const int RL0 = GREEN_LED; const int RL1 = RED_LED; const int RL2 = 12; const int RL3 = 13; const int rl_arr[] = { RL0,RL1,RL2,RL3 }; const int regs = 10; // количество регистров const int ID_slave = 1; uint16_t tab_reg[regs]; //задаем массив регистров // Инициализация SLAVE, идентификатор (адрес) в сети ID = 1 ModbusinoSlave modbusino_slave(ID_slave); // на цифр. выходы сразу записываем значение регистров // любое значение > 0 это HIGH, 0 - LOW void SetRelay() { int i; for (i = 0; i < 4; i++) { digitalWrite(rl_arr[i], tab_reg[i]); } } void setup() { modbusino_slave.setup(9600); // установка цифровых вх/вых в режим выхода pinMode(RL0, OUTPUT); pinMode(RL1, OUTPUT); pinMode(RL2, OUTPUT); pinMode(RL3, OUTPUT); } void loop() { modbusino_slave.loop(tab_reg, regs); SetRelay(); tab_reg[9] = analogRead(TEMPSENSOR); //запись аналогового значения в 9-ый регистр } Код:
root@zuriuslev:~# /home/ServoManager/ACM0/unit-test-client Opening /dev/ttyACM0 at 9600 bauds (N, 8, 1) ** UNIT TESTING ** TEST WRITE/READ: [01][03][00][00][00][0A][C5][CD] Waiting for a confirmation... <01><03><14><00><00><00><01><99><38><E8><E0><CA><79><5C><4D><EA><3D><1A><34><5D><BC><01><3E><40><7D> reg[0]=0 (0x0) reg[1]=1 (0x1) reg[2]=39224 (0x9938) reg[3]=59616 (0xE8E0) reg[4]=51833 (0xCA79) reg[5]=23629 (0x5C4D) reg[6]=59965 (0xEA3D) reg[7]=6708 (0x1A34) reg[8]=23996 (0x5DBC) reg[9]=318 (0x13E) [01][10][00][00][00][0A][14][00][01][00][00][45][67][23][C6][98][69][48][73][DC][51][5C][FF][94][4A][01][3E][6A][82] Waiting for a confirmation... <01><10><00><00><00><0A><40><0E> reg[0]=1 (0x1) reg[1]=0 (0x0) reg[2]=17767 (0x4567) reg[3]=9158 (0x23C6) reg[4]=39017 (0x9869) reg[5]=18547 (0x4873) reg[6]=56401 (0xDC51) reg[7]=23807 (0x5CFF) reg[8]=37962 (0x944A) reg[9]=318 (0x13E) [01][03][00][00][00][0A][C5][CD] Метод отлично работает ! LaunchPad MSP430 весело моргает светодиодами и показывает изменения температуры Програмка для роутера в аттачменте |
Здесь присутствуют: 3 (пользователей: 0 , гостей: 3) | |
|
|