EnglishУкраїнськаmRussian
Login/New
Topic with no new replies

Работа с протоколом CAN, RAWCAN сокет.


Author Message
Written on: 05. 08. 2015 [14:16]
legend
Oleg N
Topic creator
registered since: 13.04.2012
Posts: 63
Приветствую всех пользователей и разработчиков Open Scada.
На форуме и в документации работе с CAN протоколом уделено совсем мало внимания.

Для входящих данный по CAN шине используется сокет RAWCAN. Его настройка простая и понятная (согласно документации). Указываем адрес CAN интерфейса, маску и идентификатор: "RAWCAN:can0:0:0". Для анализа полученных данных необходимо в разделе "Транспортные протоколы - пользовательский протокол" создать часть протокола для входящих запросов.
Например так:
JAVASCRIPT
SYS.message ("TEST snd:", 7, SYS.strDecode(sender, "Bin"));
SYS.message ("TEST req:", 7, SYS.strDecode(request, "Bin"));
return 0;

В результате при получении интерфейсом CAN0 посылки 123#1122334455, в архив запишется два сообщения:
TEST req: 7 1122334455
TEST snd: 7 3239310A3135
где ID посылки 323931 - 291 dec - 123 hex.

А вот с отправкой запросов по CAN интерфейсу через исходящий транспорт у меня возникли сложности.
Из документации и примеров совсем непонятно в каком виде нужно отправлять посылку.
Пытался отправить разного типа запросы через вкладку запрос исходящего сокета RAWCAN, но пока безуспешно. Во всех случаях получаю ошибку: "Ошибка запроса: Недопустимый аргумент"
Собственно отсюда вопрос, в каком виде нужно отправлять запрос через CAN интерфейс?
Written on: 05. 08. 2015 [16:26]
fido_max
Maxim Kochetkov
Contributor
registered since: 28.10.2010
Posts: 129
https://github.com/fidomax/openscada/blob/kium/src/moduls/daq/MSO/mso_daq.cpp#L302

Посылка формируется в виде структуры struct can_frame
поля:
can_id - идентификатор (4 байта). Наличие в старшем бите 1 говорит о расширенном формате фрейма, 0 - стандартный. #define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */
can_dlc - длина поля данных (1 байт)
data[] - буфер на 8 байт для данных
Размер структуры 16 - байт. 4 байта идентификатор, 1 байт длина, 8 байт данные. три пустых байта дополнения либо перед длиной, либо после длины. скорее всего перед.


а дальше отправка в сокет: tr.at().messIO((const char *) &frame, sizeof(frame), NULL, 0, 0, true);

Через пользовательский протокол не пробовал отправлять, но думаю, что должно работать.

[This article was edited 1 times, at last 05.08.2015 at 20:40.]
Written on: 06. 08. 2015 [09:57]
fido_max
Maxim Kochetkov
Contributor
registered since: 28.10.2010
Posts: 129
в пользовательском протоколе на прием
SYS.messInfo("CAN IN","Len: "+request.length+ " Sender:" + sender + " decode: " + SYS.strDecode(request, "Bin", " "));
Len - длина поля данных
Sender - идентификатор сообщения
request - само сообщение

для посылки запроса из исходящего транспорта из вкладки запрос:

15 CD 5B 07 08 00 00 00 11 12 13 14 15 16 17 18

ID - 123456789 dec = 0x75BCD15 hex ->15 CD 5B 07 (если нужен расширенный - 0x80 добавить в последнем байте)
длина - 08 00 00 00 восемь байт
данные - 11 12 13 14 15 16 17 18
Written on: 06. 08. 2015 [13:23]
legend
Oleg N
Topic creator
registered since: 13.04.2012
Posts: 63
Максим, спасибо огромное за помощь. Все получилось. Такого короткого примера по работе с RAWCAN мне и не хватало.
Written on: 28. 09. 2016 [18:37]
legend
Oleg N
Topic creator
registered since: 13.04.2012
Posts: 63
После обновления OpenScada на версию 0.9+r2423 (Raspberry pi2 / Linux-4.4.21-v7+) возникла проблема, которой раньше не было.
При отправке запроса в RAWCAN OUT стала появляться ошибка: "Ошибка записи: Недостаточно буферного пространства (105)".
Что она обозначает? Где можно про нее почитать или как ее победить?

Update:
0.9+r2348 (Raspberry pi2 / Linux-4.1.13-v7+) - все работает хорошо.

[This article was edited 1 times, at last 28.09.2016 at 18:40.]
Written on: 28. 09. 2016 [19:42]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"legend" wrote:

После обновления OpenScada на версию 0.9+r2423 (Raspberry pi2 / Linux-4.4.21-v7+) возникла проблема, которой раньше не было.
При отправке запроса в RAWCAN OUT стала появляться ошибка: "Ошибка записи: Недостаточно буферного пространства (105)".
Что она обозначает? Где можно про нее почитать или как ее победить?

Не стоит это связывать с обновлением OpenSCADA, поскольку в коде RAWCAN там ничего не менялось, а указанная ошибка не OpenSCADA вообще.

Learn, learn and learn better than work, work and work.



8737