Я придерусь к этому участку в Ардуино-Идиотино-Дурино:
а) В Ардуино всего ШЕСТЬ регистров, а не пять, как ты тут пытаешься считыватьКод://////////////// Регистры вашего Slave ///////////////////
enum
{
//Просто добавьте или удалите регистры. Первый регистр начинается по адресу 0
slave_to_master_val_1, // с адресом массива 0
slave_to_master_val_2, // с адресом массива 1
slave_to_master_val_3, // с адресом массива 2
slave_to_master_val_4, // с адресом массива 3
slave_to_master_val_5, // с адресом массива 4
master_to_slave_val_1, // с адресом массива 5
HOLDING_REGS_SIZE // Это не удалять размер массива HOLDING_REGS.
//общее количество регистров для функции 3 и 16 разделяет тотже самый массив регистров
//т.е. то же самое адресное пространство
};
unsigned int holdingRegs[HOLDING_REGS_SIZE]; // функции 3 и 16 массив регистров
б) Запись регистров в Ардуино поддерживается командой 16 (это прямо указано в проекте), а не 6, как у тебя в проекте ПЛК.
в) Я ни фига не понимаю, как ЭТО работало в OPC, так как в Ардуино написано:
То есть, на Серву передаётся значение ШЕСТОГО регистра, согласно объявлениям, приведённым выше.Код:myservo.write(holdingRegs[master_to_slave_val_1]);
Самая моя придирка (согласо подписи про психопата) - это то, что надо давать понятные имена переменным, мать же вашу курвичную же туды-растуды!!
То есть, объявление должно быть таким:
И дальше код переписать с использованием этих имён, а не грёбаных чёртовых идиотских номеров!Код:enum
{
//Просто добавьте или удалите регистры. Первый регистр начинается по адресу 0
Reg_PressureDifferent, // с адресом массива 0 = Давление Дифференциальное (чтение)
Reg_PressureAtm, // с адресом массива 1 = Давление Атмосферное (чтение)
Reg_Temperature, // с адресом массива 2 = Температура (чтение)
Reg_Ves, // с адресом массива 3 = Весы (чтение)
Reg_Servo, // с адресом массива 4 = Сервопривод (запись)
HOLDING_REGS_SIZE // Это не удалять размер массива HOLDING_REGS.
//общее количество регистров для функции 3 и 16 разделяет тотже самый массив регистров
//т.е. то же самое адресное пространство
};
Чтобы код выглядел ТАК:
и был понятным!!! Это исключает ошибки копипасты вида "Так... а под каким номером у меня серва? Вроде под пятым... тут поправил, тут нет".Код:myservo.write(holdingRegs[Reg_Servo]);
Приведу ещё участочек. ХОСПОДЯ!! Я хочу насилия! Kill 'em All!!
Вот ШТО это за ужас? Что, куда и кому присваивается? Получается, если следовать старым объявлениям, что тут регистры, что ли, не по порядку идут? И вроде как с пятого мы что-то читаем, а для сервы в тот же "пятый" в ПЛК пишем, потому что думаем, что они идут подряд. А серва получается шестой.Код:holdingRegs[slave_to_master_val_3] = bmp180.getPressure();
holdingRegs[slave_to_master_val_2] = analogRead(sensorPin);
holdingRegs[slave_to_master_val_5] = reading;