Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Открытый проект умного дома

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.12.2012, 18:18   #11
zuriuslev
Junior Member
 
Регистрация: 19.12.2012
Адрес: Марбелья
Сообщений: 18
Вес репутации: 0
zuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond repute
Thumbs up Сегодня, успешно завершил тест работы 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 весело моргает светодиодами и показывает изменения температуры

Програмка для роутера в аттачменте
Вложения
Тип файла: zip unit-test-client.zip (3.5 Кб, 406 просмотров)
zuriuslev вне форума   Ответить с цитированием
 


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 19:36. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика