да - точноUAVpilot писал(а):Там вроде эти if выполняются один раз при старте модуля...
спасибо - что подсказал по моемУ же коду
успел запямятовать уже я ...
помню что хотел убрать для себя эти все настройки извне...
да - точноUAVpilot писал(а):Там вроде эти if выполняются один раз при старте модуля...
если заработает - то конечно увеличится ...aftaev писал(а):nkp, а шо будет если 2 ардуинки засунуть в комп
но с разными адресами #define Slave_Address 0x01 //Address of MODBus Slave
кол-во пинов увеличиться?
модуль это gs2_vfd ?nkp писал(а):получается как бы "два" модуля запускать надо...
у меня штук пять ардуинок 2560 естьnkp писал(а):зы нет второй платки попробовать
ну да ...aftaev писал(а):модуль это gs2_vfd ?
а что у тебя на 3-х оставшихся галетниках?aftaev писал(а):4 галлетника по 5 пин = 20 пин
Ник, а ты не так прост как о себе говорил!Nick писал(а):А зачем modbus???
Есть вот такая штука: http://cnc-club.ru/forum/viewtopic.php? ... it=arduino
Надо загрузить в ардуину прошивку и потом при запуске linuxcnc загрузить модуль для общения с ней. В итоге появятся обычные пины LinuxCNC...
aftaev писал(а):без детального разжевывания как и что ставить, не разберусь.Все, должны появиться пины...
- Сначала шьешь ардуину прошивкой отсюда: http://emergent.unpythonic.net/01198594294
- Сохраняешь arduino.py в каталог с конфигом
- Переименовываешь его в просто arduino.py (убираем расширение)
- Добавляем ему права на исполнение (ПКМ, Свойства-Права- Галка на исполнение)
- Потом в custom.hal добавляешь строчку (в ней может надо будет порт подправить....)
Код: Выделить всё
loadusr -W arduino /dev/ttyUSB0 3
Код: Выделить всё
//################ Initialize IO ################# // 0 => Output, 1 => Input, opposite of normal Arduino, but my habit from other platforms, 0 looks like an O and 1 looks like an I
Register[IO_Config_Register] = 0b0000000000000000; // UNO and MEGA PIN 00-15
Register[IO_Config_Register+1] = 0b0000000000000000; // MEGA PIN 16-31
Register[IO_Config_Register+2] = 0b1111111111111111; // MEGA PIN 32-47
Register[IO_Config_Register+3] = 0b1111111111111111; // MEGA PIN 48-64
Register[IO_Config_Register+4] = 0b1111111111111111; // AN Digital PIN A0-A16
//################ Kill IO Register ################# // 0 => Leave, 1 => Kill
Register[Kill_IO_Register] = 0b1111111111111111; // UNO and MEGA PIN 00-15
Register[Kill_IO_Register+1] = 0b1111111111111111; // MEGA PIN 16-31
Register[Kill_IO_Register+2] = 0b1111111111111111; // MEGA PIN 32-47
Register[Kill_IO_Register+3] = 0b1111111111111111; // MEGA PIN 48-64
Register[Kill_IO_Register+4] = 0b1111111111111111; // AN Digital PIN A0-A16
//################ PWM IO Register ################# // 0 => Normal I/O, 1 => PWM I/O
Register[PWMIOMap_Register] = 0b0000000000000000; // UNO and MEGA PWM 01-16
//################ AN IO Register ################# // 0 => Digital, 1=> Analog
Register[ANIOMap_Register] = 0b0000000000000000; // UNO and MEGA
Код: Выделить всё
/*
Reg0
2 3 4 5 6 7 8 9 10 11 12
Reg1
22 24 26 28 30 31
Reg2
32 - 47
Reg3
48 49 50 51 52
*/
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <getopt.h>
#include "rtapi.h"
#include "hal.h"
#include "modbus.h"
#define START_REGISTER_R 0x1E
#define NUM_REGISTERS_R 16
#define START_REGISTER_W 0
#define NUM_REGISTERS_W 3
#undef DEBUG
typedef struct {
int slave;
int read_reg_start;
int read_reg_count;
int write_reg_start;
int write_reg_count;
} slavedata_t;
typedef struct {
hal_s32_t retval;
hal_float_t looptime;
hal_bit_t *Din20;
hal_bit_t *Din21;
hal_bit_t *Din22;
hal_bit_t *Din23;
hal_bit_t *Din24;
hal_bit_t *Din25;
hal_bit_t *Din26;
hal_bit_t *Din27;
hal_bit_t *Din28;
hal_bit_t *Din29;
hal_bit_t *Din210;
hal_bit_t *Din211;
hal_bit_t *Din212;
hal_bit_t *Din213;
hal_bit_t *Din214;
hal_bit_t *Din215;
hal_bit_t *Din40;
hal_bit_t *Din41;
hal_bit_t *Din42;
hal_bit_t *Din43;
hal_bit_t *Din44;
hal_bit_t *Din45;
hal_bit_t *Din46;
hal_bit_t *Din47;
hal_bit_t *Din48;
hal_bit_t *Din49;
hal_bit_t *Din410;
hal_bit_t *Din411;
hal_bit_t *Din412;
hal_bit_t *Din413;
hal_bit_t *Din414;
hal_bit_t *Din415;
hal_bit_t *Din30;
hal_bit_t *Din31;
hal_bit_t *Din32;
hal_bit_t *Din33;
hal_bit_t *Din34;
} haldata_t;
static int regarg[4];
static int done;
char *modname = "arduino";
static void quit(int sig) {
done = 1;
}
int write_data(modbus_param_t *param, slavedata_t *slavedata, haldata_t *haldata) { //============== write ====================
}
int read_data(modbus_param_t *param, slavedata_t *slavedata, haldata_t *hal_data_block) {
int receive_data[MAX_READ_HOLD_REGS];
int retval;
int Reg0val=0;
int Reg1val=0;
int Reg2val=0;
int Reg3val=0;
int Reg4val=0;
int mass2[16],mass3[5],mass4[16];
int x = 0;
if (hal_data_block == NULL)
return -1;
if ((param==NULL) || (slavedata == NULL)) {
return -1;
}
//----------------------------------------------------------------------------------------читаем цифровые входы --------регистр4
retval = read_holding_registers(param, slavedata->slave, 4 , 1 , receive_data);
if (retval==1) {
retval = 0;
hal_data_block->retval = retval;
if (retval==0) {
Reg4val = receive_data[0] ; //читаем регистр4
//printf("Reg4val: %i\n", Reg4val);
x = 0;
while ( x < 16 ){
if ((Reg4val & 0x01) == 1 )
mass4[x] = 1;
else
mass4[x] = 0;
Reg4val=Reg4val>>1;
x++;
}
*(hal_data_block->Din40) = mass4[0];
*(hal_data_block->Din41) = mass4[1];
*(hal_data_block->Din42) = mass4[2];
*(hal_data_block->Din43) = mass4[3];
*(hal_data_block->Din44) = mass4[4];
*(hal_data_block->Din45) = mass4[5];
*(hal_data_block->Din46) = mass4[6];
*(hal_data_block->Din47) = mass4[7];
*(hal_data_block->Din48) = mass4[8];
*(hal_data_block->Din49) = mass4[9];
*(hal_data_block->Din410) = mass4[10];
*(hal_data_block->Din411) = mass4[11];
*(hal_data_block->Din412) = mass4[12];
*(hal_data_block->Din413) = mass4[13];
*(hal_data_block->Din414) = mass4[14];
*(hal_data_block->Din415) = mass4[15];
retval = 0;
}
}
else {
hal_data_block->retval = retval;
retval = -1;
}
//----------------------------------------------------------------------------------------читаем цифровые входы --------регистр2
retval = read_holding_registers(param, slavedata->slave, 2 , 1 , receive_data);
if (retval==1) {
retval = 0;
hal_data_block->retval = retval;
if (retval==0) {
Reg2val = receive_data[0] ; //читаем регистр2
//printf("Reg2val: %i\n", Reg2val);
x = 0;
while ( x < 16 ){
if ((Reg2val & 0x01) == 1 )
mass2[x] = 1;
else
mass2[x] = 0;
Reg2val=Reg2val>>1;
x++;
}
*(hal_data_block->Din20) = mass2[0];
*(hal_data_block->Din21) = mass2[1];
*(hal_data_block->Din22) = mass2[2];
*(hal_data_block->Din23) = mass2[3];
*(hal_data_block->Din24) = mass2[4];
*(hal_data_block->Din25) = mass2[5];
*(hal_data_block->Din26) = mass2[6];
*(hal_data_block->Din27) = mass2[7];
*(hal_data_block->Din28) = mass2[8];
*(hal_data_block->Din29) = mass2[9];
*(hal_data_block->Din210) = mass2[10];
*(hal_data_block->Din211) = mass2[11];
*(hal_data_block->Din212) = mass2[12];
*(hal_data_block->Din213) = mass2[13];
*(hal_data_block->Din214) = mass2[14];
*(hal_data_block->Din215) = mass2[15];
retval = 0;
}
}
else {
hal_data_block->retval = retval;
retval = -1;
}
//======================================== читаем цифровые входы --------регистр3
retval = read_holding_registers(param, slavedata->slave, 3 , 1 , receive_data);
if (retval==1) {
retval = 0;
hal_data_block->retval = retval;
if (retval==0) {
Reg3val = receive_data[0] ; //читаем регистр3
//printf("Reg3val: %i\n", Reg3val);
x=0;
while ( x < 5 ){
if ((Reg3val & 0x01) == 1 )
mass3[x] = 1;
else
mass3[x] = 0;
Reg3val=Reg3val>>1;
x++;
}
*(hal_data_block->Din30) = mass3[0];
*(hal_data_block->Din31) = mass3[1];
*(hal_data_block->Din32) = mass3[2];
*(hal_data_block->Din33) = mass3[3];
*(hal_data_block->Din34) = mass3[4];
retval = 0;
}
}
else {
hal_data_block->retval = retval;
retval = -1;
}
//========================================
return retval;
}
int main(int argc, char **argv)
{
int retval;
modbus_param_t mb_param;
haldata_t *haldata;
slavedata_t slavedata;
int hal_comp_id;
struct timespec loop_timespec, remaining;
int baud, bits, stopbits, debug, verbose;
char *device, *parity ;
char *regset ;
int i , rt;
done = 0;
baud = 19200;
bits = 8;
stopbits = 1;
debug = 0;
verbose = 0;
device = "/dev/ttyACM0";
parity = "none";
slavedata.slave = 1;
slavedata.read_reg_start = START_REGISTER_R;
slavedata.read_reg_count = NUM_REGISTERS_R;
slavedata.write_reg_start = START_REGISTER_W;
slavedata.write_reg_count = NUM_REGISTERS_R;
signal(SIGINT, quit);
signal(SIGTERM, quit);
getopt(argc,argv,"v:");
regset = optarg;
rt = atoi(regset);
for(i = 0;i < 4;i++){
regarg[i] = rt & 0x01;
rt = rt >> 1;
}
modbus_init_rtu(&mb_param, device, baud, parity, bits, stopbits, verbose);
mb_param.debug = debug;
if (((retval = modbus_connect(&mb_param))!=0) || done) {
printf("%s: ERROR: couldn't open serial device\n", modname);
goto out_noclose;
}
hal_comp_id = hal_init(modname);
if ((hal_comp_id < 0) || done) {
printf("%s: ERROR: hal_init failed\n", modname);
retval = hal_comp_id;
goto out_close;
}
haldata = (haldata_t *)hal_malloc(sizeof(haldata_t));
if ((haldata == 0) || done) {
printf("%s: ERROR: unable to allocate shared memory\n", modname);
retval = -1;
goto out_close;
}
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din20), hal_comp_id, "%s.Din2-0" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din21), hal_comp_id, "%s.Din2-1" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din22), hal_comp_id, "%s.Din2-2" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din23), hal_comp_id, "%s.Din2-3" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din24), hal_comp_id, "%s.Din2-4" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din25), hal_comp_id, "%s.Din2-5" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din26), hal_comp_id, "%s.Din2-6" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din27), hal_comp_id, "%s.Din2-7" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din28), hal_comp_id, "%s.Din2-8" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din29), hal_comp_id, "%s.Din2-9" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din210), hal_comp_id, "%s.Din2-10", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din211), hal_comp_id, "%s.Din2-11", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din212), hal_comp_id, "%s.Din2-12", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din213), hal_comp_id, "%s.Din2-13", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din214), hal_comp_id, "%s.Din2-14", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din215), hal_comp_id, "%s.Din2-15", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din30), hal_comp_id, "%s.Din3-0" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din31), hal_comp_id, "%s.Din3-1" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din32), hal_comp_id, "%s.Din3-2" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din33), hal_comp_id, "%s.Din3-3" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din34), hal_comp_id, "%s.Din3-4" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din40), hal_comp_id, "%s.Din4-0" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din41), hal_comp_id, "%s.Din4-1" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din42), hal_comp_id, "%s.Din4-2" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din43), hal_comp_id, "%s.Din4-3" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din44), hal_comp_id, "%s.Din4-4" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din45), hal_comp_id, "%s.Din4-5" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din46), hal_comp_id, "%s.Din4-6" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din47), hal_comp_id, "%s.Din4-7" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din48), hal_comp_id, "%s.Din4-8" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din49), hal_comp_id, "%s.Din4-9" , modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din410), hal_comp_id, "%s.Din4-10", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din411), hal_comp_id, "%s.Din4-11", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din412), hal_comp_id, "%s.Din4-12", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din413), hal_comp_id, "%s.Din4-13", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din414), hal_comp_id, "%s.Din4-14", modname); if (retval!=0) goto out_closeHAL;
retval = hal_pin_bit_newf(HAL_IN, &(haldata->Din415), hal_comp_id, "%s.Din4-15", modname); if (retval!=0) goto out_closeHAL;
*(haldata->Din20) = 0;
*(haldata->Din21) = 0;
*(haldata->Din22) = 0;
*(haldata->Din23) = 0;
*(haldata->Din24) = 0;
*(haldata->Din25) = 0;
*(haldata->Din26) = 0;
*(haldata->Din27) = 0;
*(haldata->Din28) = 0;
*(haldata->Din29) = 0;
*(haldata->Din210) = 0;
*(haldata->Din211) = 0;
*(haldata->Din212) = 0;
*(haldata->Din213) = 0;
*(haldata->Din214) = 0;
*(haldata->Din215) = 0;
*(haldata->Din30) = 0;
*(haldata->Din31) = 0;
*(haldata->Din32) = 0;
*(haldata->Din33) = 0;
*(haldata->Din34) = 0;
*(haldata->Din40) = 0;
*(haldata->Din41) = 0;
*(haldata->Din42) = 0;
*(haldata->Din43) = 0;
*(haldata->Din44) = 0;
*(haldata->Din45) = 0;
*(haldata->Din46) = 0;
*(haldata->Din47) = 0;
*(haldata->Din48) = 0;
*(haldata->Din49) = 0;
*(haldata->Din410) = 0;
*(haldata->Din411) = 0;
*(haldata->Din412) = 0;
*(haldata->Din413) = 0;
*(haldata->Din414) = 0;
*(haldata->Din415) = 0;
while (done==0) {
read_data(&mb_param, &slavedata, haldata);
//write_data(&mb_param, &slavedata, haldata);
if (haldata->looptime < 0.001) haldata->looptime = 0.001;
if (haldata->looptime > 2.0) haldata->looptime = 2.0;
loop_timespec.tv_sec = (time_t)(haldata->looptime);
loop_timespec.tv_nsec = (long)((haldata->looptime - loop_timespec.tv_sec) * 1000000000l);
nanosleep(&loop_timespec, &remaining);
}
retval = 0;
out_closeHAL:
hal_exit(hal_comp_id);
out_close:
modbus_close(&mb_param);
out_noclose:
return retval;
}
Код: Выделить всё
open: No such device
ERROR Opening device /dev/ttyACM0 (no : 19)
arduino: ERROR: couldn't open serial device
что ты имел в виду?asutpka писал(а):ой как не вовремя
вопрос снят - в прошивке недоглядел:nkp писал(а):что бы это значило:
nkp писал(а):что ты имел в виду?
видимо я ошибочно предположил, что дым остановил всю работу. Если это не так я только рад!nkp писал(а):после замыкания по питанию модбас вылетает,ардуина не конектится даже после reset:
нееее - до волшебного дыма не дошлоasutpka писал(а):дым остановил всю работу.
маловато будетnkp писал(а):37 входов
да тут загвоздка не в количестве - не реагируют некоторые ноги(0-й регистр) может попробуешь у себя...aftaev писал(а):маловато будет
это примерно с какой по какой ноги?nkp писал(а):не реагируют некоторые ноги(0-й регистр)
можно вернуть чтобы аналоговые сигналы были входами но как аналоговые, а не дискретные. Как до этого былоnkp писал(а):может попробуешь у себя...
тут конфиг - я в нем убрал панель во вкладке...aftaev писал(а):можно вернуть