Я придерусь к этому участку в Ардуино-Идиотино-Дурино:
а) В Ардуино всего ШЕСТЬ регистров, а не пять, как ты тут пытаешься считыватьКод://////////////// Регистры вашего 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;


Ответить с цитированием
