{"id":477560,"date":"2026-04-27T08:32:21","date_gmt":"2026-04-27T08:32:21","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=477560"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=477560","title":{"rendered":"\u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c OpenPLC \u0441 CAN bus"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0438\u0438 \u0434\u043b\u044f \u0434\u0435\u043c\u043e-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 OpenPLC. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/1025660\/\" rel=\"noopener noreferrer nofollow\">\u0447\u0430\u0441\u0442\u0438<\/a> \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Raspberry Pi Pico W \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Modbus RTU\/TCP Slave, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0435 \u0447\u0435\u0440\u0435\u0437 Ladder-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0445\u0435\u043c\u0443 CAN-\u0448\u0438\u043d\u0443.<br \/> \u0427\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438: \u0443\u0437\u0435\u043b Pico W \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c MCP2515 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a CAN-\u0448\u0438\u043d\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 OpenPLC Editor \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 \u0430\u0440\u0434\u0443\u0438\u043d\u043e-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a CAN-\u0448\u0438\u043d\u0435 \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 Ladder-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0447\u0435\u0440\u0435\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435-\u043c\u0430\u0440\u043a\u0435\u0440\u044b <code>%MW<\/code>.<\/p>\n<h2>\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f MCP2515 \u043a Raspberry Pi Pico W \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e Pico \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c 3.3V, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 MCP2515 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u044b \u043d\u0430 5V. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/1003936\/\" rel=\"noopener noreferrer nofollow\">Can bus \u043d\u0430 Orange pi 4 pro<\/a> \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e can-\u0442\u0440\u0430\u043d\u0441\u0438\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f, \u0438 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0435.<\/p>\n<p>\u0423 Pico \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 SPI. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 SPI0. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 OpenPLC \u0438 Arduino IDE \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0432\u044f\u0437\u043a\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\"><strong>MCP2515 Pin<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>Pico Pin (GPIO)<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>Pico Pin (Physical)<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>VCC<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>3V3<\/strong> \u0438\u043b\u0438 <strong>5V<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Pin 36 \u0438\u043b\u0438 40<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>GND<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>GND<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041b\u044e\u0431\u043e\u0439 GND (\u043d\u0430\u043f\u0440. Pin 38)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0431\u0449\u0430\u044f \u0437\u0435\u043c\u043b\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>CS<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>GP17<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Pin 22<\/p>\n<\/td>\n<td>\n<p align=\"left\">Chip Select (\u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>SO (MISO)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>GP16<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Pin 21<\/p>\n<\/td>\n<td>\n<p align=\"left\">SPI0 RX<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>SI (MOSI)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>GP19<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Pin 25<\/p>\n<\/td>\n<td>\n<p align=\"left\">SPI0 TX<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>SCK<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>GP18<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Pin 24<\/p>\n<\/td>\n<td>\n<p align=\"left\">SPI0 SCK<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>INT<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>GP20<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Pin 26<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/293\/3a1\/9f8\/2933a19f8dc1fb03a2604f3761d44da8.png\" width=\"1685\" height=\"1192\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/293\/3a1\/9f8\/2933a19f8dc1fb03a2604f3761d44da8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/293\/3a1\/9f8\/2933a19f8dc1fb03a2604f3761d44da8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043f\u0438\u0442\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e.<br \/> \u0412\u0441\u0435 CAN-\u043c\u043e\u0434\u0443\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a \u043e\u0434\u043d\u043e\u0439 CAN-\u0448\u0438\u043d\u0435, \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u044d\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u0432 \u0432\u0438\u0434\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0445 \u0448\u0438\u043d\u0430\u0445 \u043c\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b. \u0420\u0430\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 Modbus-\u043c\u043e\u0434\u0443\u043b\u0438 \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b. \u0421\u043b\u0435\u0432\u0430 \u0432\u043d\u0438\u0437\u0443 \u0436\u0435\u043b\u0442\u044b\u0439 \u043a\u0440\u0443\u0433 &#8212; \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c PMSM \u0441 \u043f\u043b\u0430\u0442\u043e\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/1023492\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>).<br \/> \u0412\u0432\u0435\u0440\u0445\u0443 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f Raspberry pi (\u0441\u043c. <a href=\"https:\/\/habr.com\/ru\/articles\/1025660\/#:~:text=RS485%20CAN%20HAT%20%D1%88%D0%B8%D0%BB%D0%B4%20%D0%B4%D0%BB%D1%8F%20Raspberry%20pi.\" rel=\"noopener noreferrer nofollow\">\u0448\u0438\u043b\u0434 \u0434\u043b\u044f Raspberry pi<\/a>), \u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u0441\u043b\u0435\u0432\u0430 &#8212; Raspberry Pi Pico W \u0441 \u0434\u0432\u0443\u043c\u044f \u0440\u0435\u043b\u0435.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cf8\/673\/5a4\/cf86735a4c82b88cfa071626c56d4dec.png\" width=\"3133\" height=\"2288\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cf8\/673\/5a4\/cf86735a4c82b88cfa071626c56d4dec.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cf8\/673\/5a4\/cf86735a4c82b88cfa071626c56d4dec.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h2>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 C++ \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430<\/h2>\n<p>OpenPLC Editor \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043d\u0430 C++. \u042d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/edge.autonomylogic.com\/docs\/openplc-editor\/custom-languages\/cpp-blocks\/cpp-structure\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0431\u043b\u043e\u043a \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a \u0432 Arduino IDE:<\/p>\n<pre><code class=\"cpp\">void setup() {    \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 - \u0432 \u043f\u0435\u0440\u0432\u043e\u043c scan-\u0446\u0438\u043a\u043b\u0435.    \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0436\u0435\u043b\u0435\u0437\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u044b\u0445\u043e\u0434\u043e\u0432.}void loop() {    \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 scan-\u0446\u0438\u043a\u043b, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e.    \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430: \u0447\u0442\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043e\u0432, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430, \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u044b\u0445\u043e\u0434\u043e\u0432.}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>IDE \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 &#8212; \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<p><strong>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c<\/strong><\/p>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0431\u043b\u043e\u043a\u0430 (Inputs\/Outputs\/Internals), \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u044f\u0432\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b-\u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0432 \u0442\u0435\u043b\u0435 \u0431\u043b\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">OUTPUT_VAL = INPUT_VAL * 2.0;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code><em>(vars-&gt;OUTPUT_VAL) = <\/em>(vars-&gt;INPUT_VAL) * 2.0<\/code>. \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e &#8212; \u043d\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e <code>vars<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 <code>setup()<\/code>\/<code>loop()<\/code>, \u0447\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 callback-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 &#8212; \u043d\u0438\u0436\u0435).<\/p>\n<p><strong>\u0422\u0438\u043f\u044b IEC \u2192 C<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">IEC \u0442\u0438\u043f<\/p>\n<\/th>\n<th>\n<p align=\"left\">C \u0442\u0438\u043f<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>BOOL<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>uint8_t<\/code> (IEC_BOOL)<\/p>\n<\/td>\n<td>\n<p align=\"left\">8 \u0431\u0438\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>INT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>int16_t<\/code> (IEC_INT)<\/p>\n<\/td>\n<td>\n<p align=\"left\">16 \u0431\u0438\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>UINT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>uint16_t<\/code> (IEC_UINT)<\/p>\n<\/td>\n<td>\n<p align=\"left\">16 \u0431\u0438\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>DINT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>int32_t<\/code> (IEC_DINT)<\/p>\n<\/td>\n<td>\n<p align=\"left\">32 \u0431\u0438\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>REAL<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>float<\/code> (IEC_REAL)<\/p>\n<\/td>\n<td>\n<p align=\"left\">32 \u0431\u0438\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>LREAL<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>double<\/code> (IEC_LREAL)<\/p>\n<\/td>\n<td>\n<p align=\"left\">64 \u0431\u0438\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>WORD<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>uint16_t<\/code> (IEC_WORD)<\/p>\n<\/td>\n<td>\n<p align=\"left\">16 \u0431\u0438\u0442<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<blockquote>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/strong> <code>IEC_BOOL<\/code> &#8212; \u044d\u0442\u043e <code>uint8_t<\/code>, \u0430 \u043d\u0435 C++ <code>bool<\/code>. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441 <code>0<\/code>, \u0430 \u043d\u0435 \u0441 <code>1<\/code>.<\/p>\n<\/blockquote>\n<p><strong>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0446\u0438\u043a\u043b\u0430\u043c\u0438<\/strong><\/p>\n<p>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 C++ \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430 \u0431\u043b\u043e\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0441\u0432\u043e\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 scan-\u0446\u0438\u043a\u043b\u0430\u043c\u0438 &#8212; \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0442\u0430\u0439\u043c\u0435\u0440\u044b, \u0444\u043b\u0430\u0433\u0438, \u0431\u0443\u0444\u0435\u0440\u044b).<\/p>\n<p>\u041f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u043e\u0434 Arduino-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 Arduino API \u0447\u0435\u0440\u0435\u0437 <\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430<\/h3>\n<p>\u0412 OpenPLC editor v4 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0432 Arduino function blocks \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438: ARDUINOCAN_CONF, ARDUINOCAN_WRITE, ARDUINOCAN_WRITE_WORD, ARDUINOCAN_READ.<br \/> \u041d\u043e \u043f\u043e \u043f\u0440\u0430\u0432\u0434\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u041d\u0430 <a href=\"https:\/\/%5Bthiagoralves%5D(https:\/\/openplc.discussion.community\/profile\/4520672)\" rel=\"noopener noreferrer nofollow\">\u0444\u043e\u0440\u0443\u043c\u0435<\/a> \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e Arduino \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u044d\u0442\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438 \u0447\u0442\u043e \u0442\u0430\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0431\u0430\u0433, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u043a.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043d\u0430 C\/C++.<br \/> \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 &#171;\u041f\u043b\u044e\u0441\u043e\u043c&#187;, \u0432\u044b\u0431\u0440\u0430\u0442\u044c <code>Functional Block<\/code>, \u0432 \u043f\u043e\u043b\u0435 <code>POU name<\/code> \u0432\u044b\u0431\u0440\u0430\u0442\u044c <code>C\/C++<\/code>. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u0432 \u043f\u043e\u043b\u0435 <code>POU name<\/code> \u0432\u0432\u0435\u0434\u0435\u043c <code>CAN_INTERFACE<\/code>.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2c8\/6b8\/432\/2c86b84320929e9dacf7ae2461e4ac8f.png\" width=\"430\" height=\"424\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2c8\/6b8\/432\/2c86b84320929e9dacf7ae2461e4ac8f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2c8\/6b8\/432\/2c86b84320929e9dacf7ae2461e4ac8f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0418\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ID_FILTER<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>INT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">CAN ID \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043b\u043e\u043a \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>300<\/code> (0x12C)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ID_STATE<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>INT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">CAN ID \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0440\u0430\u0441\u0441\u044b\u043b\u0430\u0435\u043c\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u043c<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>310<\/code> (0x136)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>STATE_PERIOD<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>INT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0438\u043e\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 <code>ID_STATE<\/code>-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>500<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>INPUT_ADDRESS<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>INT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e <code>%MW<\/code>, \u0447\u044c\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 TX-\u0444\u0440\u0435\u0439\u043c<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>2<\/code> \u2192 <code>%MW2<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>NUM_OF_INPUT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>INT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e <code>%MW<\/code>-\u0441\u043b\u043e\u0432, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 TX-\u0444\u0440\u0435\u0439\u043c (<code>ID_STATE<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>2<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>OUTPUT_ADDRESS<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>INT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e <code>%MW<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f payload \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e RX-\u0444\u0440\u0435\u0439\u043c\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0<\/code> \u2192 <code>%MW0<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>NUM_OF_OUTPUT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>INT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e <code>%MW<\/code>-\u0441\u043b\u043e\u0432, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u044b\u0445 \u0438\u0437 RX-\u0444\u0440\u0435\u0439\u043c\u0430 (<code>ID_FILTER<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>2<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ERR<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u044b\u0445\u043e\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>BOOL<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>TRUE<\/code>, \u0435\u0441\u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f CAN-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u043e\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>FALSE<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u0441\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0431\u043b\u043e\u043a\u0430. \u0410 \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043a\u043e\u0434\u0430<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7bc\/343\/67c\/7bc34367ceceb937c66f2ab8d7edb2a4.png\" width=\"1526\" height=\"916\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7bc\/343\/67c\/7bc34367ceceb937c66f2ab8d7edb2a4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7bc\/343\/67c\/7bc34367ceceb937c66f2ab8d7edb2a4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u0440\u0435\u0434\u044b: OpenPLC + matiec + Arduino SDK<\/h4>\n<p>OpenPLC Editor 4 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <a href=\"https:\/\/github.com\/thiagoralves\/matiec\" rel=\"noopener noreferrer nofollow\">matiec<\/a> (\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 IEC 61131-3), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u044f\u0437\u044b\u043a\u0430\u0445 ST\/LD\/FBD \u0432 C-\u043a\u043e\u0434. \u0414\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Raspberry Pi Pico W \u044d\u0442\u043e\u0442 C-\u043a\u043e\u0434 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 Arduino Sketch \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 <code>arm-none-eabi-gcc<\/code>.<\/p>\n<p>\u042d\u0442\u0430\u043f\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>OpenPLC Editor    \u2502    \u25bc[matiec compiler]    \u2502  IEC 61131-3 (ST\/LD) \u2192 C-\u043a\u043e\u0434    \u25bc build\/Raspberry Pico W\/src\/    \u251c\u2500\u2500 POUS.c \/ Config0.c \/ Res0.c   \u2190 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 PLC    \u251c\u2500\u2500 glueVars.c                     \u2190 int_memory[], bool_input[][], etc.    \u2514\u2500\u2500 LOCATED_VARIABLES.h           \u2190 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f %MW, %MX, %IX, %QX    \u2502    \u25bc[code generator: xml2st \/ jinja2]    \u2502  \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u0434\u043b\u044f C++ \u0431\u043b\u043e\u043a\u043e\u0432    \u25bc build\/Raspberry Pico W\/examples\/Baremetal\/   \u2190 sketch-\u043f\u0430\u043f\u043a\u0430 (Arduino CLI \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 .cpp\/.c\/.h \u0438\u0437 \u043d\u0435\u0451)    \u251c\u2500\u2500 Baremetal.ino       \u2190 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 sketch    \u251c\u2500\u2500 c_blocks_code.cpp   \u2190 typedef IEC_UINT, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b VARS, \u043c\u0430\u043a\u0440\u043e\u0441\u044b + \u043a\u043e\u0434 \u0438\u0437 .cpp function block    \u251c\u2500\u2500 arduino_libs.h      \u2190 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 #include \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 (DS18B20, MQTT \u0438 \u0442.\u0434.)    \u2514\u2500\u2500 ModbusSlave.cpp     \u2190 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0440\u044f\u0434\u043e\u043c    \u2502    \u25bc[Arduino CLI + pqt-gcc arm-none-eabi]    \u2502  \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0435\u0441\u044c sketch \u0432 .elf \/ .uf2    \u25bc \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0434\u043b\u044f Pico W<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 &#8212; \u0444\u0430\u0439\u043b <a href=\"https:\/\/github.com\/vladipirogov\/Relay-Control-via-Modbus\/blob\/main\/build\/Raspberry%20Pico%20W\/examples\/Baremetal\/c_blocks_code.cpp\" rel=\"noopener noreferrer nofollow\">c_blocks_code.cpp<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e C++ \u0431\u043b\u043e\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>CAN_INTERFACE_VARS<\/code> \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043d\u0430 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u044b-\u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b (<code>#define ID_FILTER (*(vars-&gt;ID_FILTER))<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>can_interface_setup(CAN_INTERFACE_VARS*)<\/code> \u0438 <code>can_interface_loop(CAN_INTERFACE_VARS*)<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 &#8212; \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437 <code>.cpp<\/code> \u0444\u0430\u0439\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430<\/p>\n<\/li>\n<\/ol>\n<p>\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e <code>setup()<\/code> \/ <code>loop()<\/code> \u0438\u0437 <code>.cpp<\/code> \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a <code>can_interface_setup<\/code> \/ <code>can_interface_loop<\/code> &#8212; \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 PLC.<br \/> \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u0430 <code>ID_FILTER<\/code> \u0432 \u043a\u043e\u0434\u0435 &#8212; \u044d\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 <code>vars<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0445 \u0432\u043d\u0435 <code>setup\/loop<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043d\u0443\u0442\u0440\u0438 callback) \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: <code>vars<\/code> \u0442\u0430\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.<\/p>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 INPUT_ADDRESS \u0438 OUTPUT_ADDRESS &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0441\u043b\u0430, \u0430 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 IEC<\/h4>\n<p>\u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 IEC 61131-3 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 OpenPLC Editor \u043e\u043d\u0438 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b &#8212; \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u0440\u044f\u043c\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c <a href=\"https:\/\/openplc.discussion.community\/post\/does-it-supports-pointers-10284210?trail=30\" rel=\"noopener noreferrer nofollow\">\u0444\u043e\u0440\u0443\u043c\u0435<\/a>: \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 <code>VAR_INPUT<\/code> \u0442\u0438\u043f\u0430 <code>POINTER TO<\/code> \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>ADR()<\/code> \u0432 Ladder\/ST-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>\u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0431\u043b\u043e\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p><code>INPUT_ADDRESS<\/code> \u0438 <code>OUTPUT_ADDRESS<\/code> &#8212; \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 (<code>INT<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0431\u043b\u043e\u043a\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 OpenPLC Editor<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0441\u0432\u0435\u043d\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 C++: \u043f\u043e \u0447\u0438\u0441\u043b\u0443-\u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code>int_memory[]<\/code> \u0438 \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">\/\/ \u0412\u043c\u0435\u0441\u0442\u043e \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e (\u043d\u0435\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432 OpenPLC):\/\/   VAR_INPUT addr : POINTER TO WORD; END_VAR\/\/   addr^ := received_value;\/\/ \u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 C++:int idx = OUTPUT_ADDRESS + i;          \/\/ OUTPUT_ADDRESS - \u043f\u0440\u043e\u0441\u0442\u043e INT \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044bif (idx &lt; MAX_MEMORY_WORDS &amp;&amp; int_memory[idx])    *int_memory[idx] = value;          \/\/ \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c C<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u0443\u044e \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044e &#8212; \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 C++ \u043a\u043e\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430.<\/p>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 int_memory[], \u0430 \u043d\u0435 accessor-\u0444\u0443\u043d\u043a\u0446\u0438\u044f<\/h4>\n<p>\u0412 runtime OpenPLC (<code>glueVars.c<\/code>) \u0432\u0441\u0435 <code>%MW<\/code>-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439:<\/p>\n<pre><code class=\"cpp\">\/\/ glueVars.c - \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438IEC_UINT *int_memory[MAX_MEMORY_WORD];  \/\/ MAX_MEMORY_WORD = 20 \u0434\u043b\u044f Pico W<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>int_memory[n]<\/code> &#8212; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443 <code>%MWn<\/code>. \u0417\u0430\u043f\u0438\u0441\u044c \u0432 <code>*int_memory[n]<\/code> \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 PLC-\u043e\u0431\u0440\u0430\u0437\u0435, \u0434\u0435\u043b\u0430\u044f \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f Ladder-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0438 Modbus.<\/p>\n<p>\u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>get_uint_located_variable()<\/code> \u0432 runtime \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 &#8212; \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 &#8212; <code>extern IEC_UINT *int_memory[]<\/code> \u0438 \u043f\u0440\u044f\u043c\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438.<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435:<\/strong> \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 20 (\u0438\u043d\u0434\u0435\u043a\u0441\u044b 0\u201319). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 <code>%MW20<\/code> \u0438 \u0432\u044b\u0448\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>int_memory[]<\/code> &#8212; \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 PLC \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>%MW0<\/code>\u2013<code>%MW19<\/code>.<\/p>\n<h4>\u041b\u043e\u0433\u0438\u043a\u0430 \u0431\u043b\u043e\u043a\u0430 CAN_INTERFACE<\/h4>\n<h3>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/h3>\n<p>\u0412 \u0441\u0440\u0435\u0434\u0443 Arduino IDE \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/sandeepmistry\/arduino-CAN\" rel=\"noopener noreferrer nofollow\">arduino-CAN<\/a>. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438 \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043b\u043e\u0433\u0438\u043a\u0443.<br \/> \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0432 \u043c\u0435\u043d\u044e <code>Examples<\/code> -&gt; <code>CAN<\/code><\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u043b\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445: <code>CANSender<\/code>, <code>CANReceiverCallback<\/code>. \u0420\u0435\u0448\u0435\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0438\u0445 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043a\u043e\u043b\u043b\u0431\u044d\u043a-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 CAN-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u041d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440 <code>CANReceiver<\/code>.<\/p>\n<p><strong>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f (setup)<\/strong><\/p>\n<pre><code class=\"cpp\">void setup() {    CAN.setPins(CAN_CS_PIN, CAN_INT_PIN);    CAN.setClockFrequency(8E6);    if (!CAN.begin(500E3)) {        ERR = true;        return;    }    \/\/ Hardware ID filter: only frames with exactly ID_FILTER pass to onReceive.    \/\/ mask 0x7FF = all 11 standard-ID bits must match.    CAN.filter(ID_FILTER, 0x7FF);    CAN.onReceive(onReceive);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u0430 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u0432\u0430\u0440\u0446\u0435\u0432\u043e\u0433\u043e \u0440\u0435\u0437\u043e\u043d\u0430\u0442\u043e\u0440\u0430 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u044d\u0442\u043e 8\u041c\u0413\u0446 <code>CAN.setClockFrequency(8E6);<\/code><br \/> \u0417\u0430\u0434\u0430\u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 CAN-\u0448\u0438\u043d\u044b 500 \u043a\u0431\u0438\u0442\/\u0441\u0435\u043a &#8212; <code>CAN.begin(500E3)<\/code><br \/> \u0418 \u0437\u0434\u0435\u0441\u044c \u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b SPI-\u043f\u0438\u043d\u044b: CS \u0438 INT &#8212; <code>CAN.setPins(CAN_CS_PIN, CAN_INT_PIN);<\/code> \u0430\u0434\u0440\u0435\u0441\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432\u044b\u0448\u0435<\/p>\n<pre><code class=\"cpp\">const int CAN_CS_PIN  = 17;const int CAN_INT_PIN = 20;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>_\u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u0442\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0440\u0443\u0433\u0430\u044f, \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0438\u043d\u044b CS \u0438 INT, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e CAN ID: <code>CAN.filter(ID_FILTER, 0x7FF)<\/code>. \u041c\u0430\u0441\u043a\u0430 <code>0x7FF<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 11 \u0431\u0438\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e ID \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e. \u0424\u0438\u043b\u044c\u0442\u0440 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0447\u0438\u043f MCP2515: \u0444\u0440\u0435\u0439\u043c\u044b \u0441 \u0447\u0443\u0436\u0438\u043c ID \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0431\u044d\u043a <code>onReceive<\/code> \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 CAN-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 <code>CAN.onReceive(onReceive);<\/code><\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u043b\u043e\u043a\u0430 CAN_INTERFACE \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e <a href=\"https:\/\/github.com\/vladipirogov\/Relay-Control-via-Modbus\/blob\/main\/pous\/function-blocks\/CAN_INTERFACE.cpp\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p><strong>\u041f\u0440\u0438\u0451\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (ISR &#8212; onReceive)<\/strong><\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95e\/2df\/2fd\/95e2df2fd5757b53f62a8704a9253d84.png\" width=\"378\" height=\"474\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/95e\/2df\/2fd\/95e2df2fd5757b53f62a8704a9253d84.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95e\/2df\/2fd\/95e2df2fd5757b53f62a8704a9253d84.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>Callback \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e \u0444\u0440\u043e\u043d\u0442\u0443 INT. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 ID \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 &#8212; \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 <code>CAN.filter()<\/code> \u0443\u0436\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0439 ID. \u041e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e RTR-\u0444\u0440\u0435\u0439\u043c\u044b (\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0431\u0435\u0437 payload) \u0438 \u043f\u0443\u0441\u0442\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u044b. \u0411\u0430\u0439\u0442\u044b \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0430 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 <code><em>rx<\/em>buf<\/code> \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 <code><em>rx<\/em>ready = true<\/code>. \u0411\u043e\u043b\u044c\u0448\u0435 callback \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 &#8212; \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0431\u043b\u043e\u043a\u0430, \u0432\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u0432 <code>loop()<\/code>.<\/p>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b (loop &#8212; \u043a\u0430\u0436\u0434\u044b\u0439 scan-\u0446\u0438\u043a\u043b)<\/strong><\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/db9\/a52\/90c\/db9a5290c7cd1d0db0495251d8a906a8.png\" width=\"201\" height=\"853\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/db9\/a52\/90c\/db9a5290c7cd1d0db0495251d8a906a8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/db9\/a52\/90c\/db9a5290c7cd1d0db0495251d8a906a8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 scan-\u0446\u0438\u043a\u043b <code>loop()<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043b\u0430\u0433 <code><em>rx<\/em>ready<\/code>. \u0415\u0441\u043b\u0438 callback \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u043d\u043e\u0432\u044b\u0439 \u0444\u0440\u0435\u0439\u043c: \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 <code><em>rx<\/em>buf<\/code> \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 bytes \u043a\u0430\u043a <code>uint16_t<\/code> \u0441\u043b\u043e\u0432\u0430 (little-endian) &#8212; \u043f\u0430\u0440\u044b \u0431\u0430\u0439\u0442 \u0432 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 &#8212; \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 <code>int_memory[OUTPUT_ADDRESS + i]<\/code>. \u0412\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 RX, \u043a\u0430\u0436\u0434\u044b\u0435 <code>STATE_PERIOD<\/code> \u043c\u0441 \u0447\u0438\u0442\u0430\u0435\u0442 <code>int_memory[INPUT_ADDRESS + i]<\/code> \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 TX-\u0444\u0440\u0435\u0439\u043c \u043d\u0430 <code>ID_STATE<\/code>.<\/p>\n<blockquote>\n<p><strong>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435:<\/strong> CAN 2.0 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 8 \u0431\u0430\u0439\u0442 = 4 \u0441\u043b\u043e\u0432\u0430 <code>uint16_t<\/code> \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0435. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>NUM_OF_INPUT<\/code> \u0438 <code>NUM_OF_OUTPUT<\/code> \u043e\u0431\u0440\u0435\u0437\u0430\u044e\u0442\u0441\u044f \u0434\u043e 4 &#8212; \u043b\u0438\u0448\u043d\u0438\u0435 \u0441\u043b\u043e\u0432\u0430 \u043c\u043e\u043b\u0447\u0430 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u043d\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0411\u043b\u043e\u043a \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432: \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 (<code>_rx_buf<\/code>, <code><em>rx<\/em>ready<\/code>) \u0438 \u0432\u044b\u0437\u043e\u0432\u044b <code>CAN.begin()<\/code>\/<code>CAN.filter()<\/code>\/<code>CAN.onReceive()<\/code> \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b &#8212; \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e. \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0431\u043e\u043b\u0435\u0435 4 \u0441\u043b\u043e\u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u043b\u043e\u043a\u0430<\/p>\n<\/blockquote>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 int_memory[] \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 loop(), \u0430 \u043d\u0435 \u0432 onReceive()<\/h4>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u043e\u0433\u0438\u0447\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u044f\u043c\u043e \u0432 callback &#8212; \u0437\u0430\u0447\u0435\u043c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440? \u041d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432 <code>onReceive()<\/code> \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0437-\u0437\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043a\u043e\u0434\u0430 OpenPLC.<\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 (<code>OUTPUT_ADDRESS<\/code>, <code>NUM_OF_OUTPUT<\/code> \u0438 \u0442.\u0434.) \u0432 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 <code>c_blocks_code.cpp<\/code> &#8212; \u044d\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b:<\/p>\n<pre><code class=\"cpp\">#define OUTPUT_ADDRESS  (*(vars-&gt;OUTPUT_ADDRESS))#define NUM_OF_OUTPUT   (*(vars-&gt;NUM_OF_OUTPUT))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c <code>vars<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>can_interface_setup<\/code> \u0438 <code>can_interface_loop<\/code>. Callback <code>onReceive<\/code> &#8212; \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, <code>vars<\/code> \u0432 \u0435\u0451 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<p>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>OUTPUT_ADDRESS<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 <code>onReceive()<\/code> \u0434\u0430\u0451\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">error: 'vars' was not declared in this scope    #define OUTPUT_ADDRESS (*(vars-&gt;OUTPUT_ADDRESS))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>ID_FILTER<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 callback &#8212; \u0438 \u0440\u0435\u0448\u0438\u043b \u0435\u0451 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code><em>id<\/em>filter_cached<\/code> \u0432 <code>setup()<\/code>.<\/p>\n<p>\u0414\u043b\u044f <code>OUTPUT_ADDRESS<\/code> \u0438 <code>NUM_OF_OUTPUT<\/code> \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c <code><em>rx<\/em>buf<\/code> + \u0444\u043b\u0430\u0433\u043e\u043c <code><em>rx<\/em>ready<\/code> \u0440\u0435\u0448\u0430\u0435\u0442 \u043e\u0431\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u0440\u0430\u0437\u0443: callback \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c (\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0441 SPI-\u0448\u0438\u043d\u044b), \u0430 \u0432\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <code>loop()<\/code>, \u0433\u0434\u0435 <code>vars<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.<\/p>\n<h4>\u0424\u043e\u0440\u043c\u0430\u0442 CAN-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/h4>\n<p>\u0411\u043b\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0434\u0432\u0443\u043c\u044f CAN ID:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">ID<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ID_FILTER<\/code> (\u043f\u043e \u0443\u043c\u043e\u043b\u0447. <code>0x12C<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\">RX<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u2192 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>%MW<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ID_STATE<\/code> (\u043f\u043e \u0443\u043c\u043e\u043b\u0447. <code>0x136<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\">TX<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 PLC \u2192 \u0448\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u0424\u043e\u0440\u043c\u0430\u0442 payload &#8212; little-endian <\/strong><code><strong>uint16_t<\/strong><\/code><strong> \u0441\u043b\u043e\u0432\u0430:<\/strong><\/p>\n<pre><code>\u0411\u0430\u0439\u0442\u044b: [lo0] [hi0] [lo1] [hi1] ...         \u2514\u2500\u2500\u2500 %MW{OUTPUT_ADDRESS} \u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500 %MW{OUTPUT_ADDRESS+1} \u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f <code>OUTPUT_ADDRESS=3<\/code>, <code>NUM_OF_OUTPUT=2<\/code>:<\/p>\n<pre><code class=\"bash\">cansend can0 12C#01 00 00 00   \u2192  %MW3 = 0x0001,  %MW4 = 0x0000cansend can0 12C#03 00 02 00   \u2192  %MW3 = 0x0003,  %MW4 = 0x0002<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c callback \u043d\u0430 RP2040<\/h4>\n<p>Callback <code>onReceive<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u0431\u0443\u0444\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: ISR \u043f\u0438\u0448\u0435\u0442 \u0432 <code><em>rx<\/em>buf<\/code> \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u043b\u0430\u0433 <code><em>rx<\/em>ready<\/code>, \u0430 <code>loop()<\/code> \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0431\u0443\u0444\u0435\u0440 \u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0444\u043b\u0430\u0433. \u0417\u0430\u043f\u0438\u0441\u044c \u0432 <code>int_memory[]<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <code>loop()<\/code> &#8212; \u0432\u043d\u0435 ISR.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0412 loop(): \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0438 \u0441\u0431\u0440\u043e\u0441 \u0444\u043b\u0430\u0433\u0430uint8_t buf[8];int len = _rx_len;for (int i = 0; i &lt; len; i++) buf[i] = _rx_buf[i];_rx_ready = false;\/\/ ... \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 int_memory[] ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041d\u0443\u0436\u0435\u043d \u043b\u0438 <\/strong><code><strong>noInterrupts()<\/strong><\/code><\/p>\n<p>\u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 &#8212; \u0434\u0430: ISR \u043c\u043e\u0436\u0435\u0442 \u0432\u043a\u043b\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 load-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code><em>rx<\/em>buf<\/code> \u043d\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0447\u0442\u043e \u0434\u0430\u0441\u0442 \u0441\u043c\u0435\u0441\u044c \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435.<br \/> \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<h4>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438: BOOL_ON_WORD \u0438 WORD_ON_BOOL<\/h4>\n<p>CAN_INTERFACE \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441 <code>%MW<\/code>-\u0441\u043b\u043e\u0432\u0430\u043c\u0438 (16-\u0431\u0438\u0442\u043d\u044b\u043c\u0438 \u0446\u0435\u043b\u044b\u043c\u0438). \u041e\u0434\u043d\u0430\u043a\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u041f\u041b\u041a \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0431\u0443\u043b\u0435\u0432\u044b\u043c\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u043c\u0438: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0440\u0435\u043b\u0435, \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0432\u0445\u043e\u0434\u0430\u043c\u0438, \u0444\u043b\u0430\u0433\u0430\u043c\u0438. \u0427\u0442\u043e\u0431\u044b \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043c\u0438\u0440 \u0431\u0438\u0442\u043e\u0432 \u0441 \u043c\u0438\u0440\u043e\u043c \u0441\u043b\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0434\u0432\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 ST. \u0418\u0434\u0435\u044e \u0442\u0430\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u043b <a href=\"https:\/\/bric-beremiz.readthedocs.io\/ru\/openplc\/beremiz\/functional_blocks.html#type-conversion\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p><code><strong>BOOL_ON_WORD<\/strong><\/code> &#8212; \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 16 \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u0432\u0445\u043e\u0434\u043e\u0432 (<code>B_IN0<\/code>\u2026<code>B_IN15<\/code>) \u0432 \u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0432\u043e <code>WORD_OUT<\/code>, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0431\u0438\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e <code>TRUE<\/code>-\u0432\u0445\u043e\u0434\u0430:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bea\/a17\/598\/beaa17598bfac03536c782c41a721dc1.png\" width=\"149\" height=\"360\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bea\/a17\/598\/beaa17598bfac03536c782c41a721dc1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bea\/a17\/598\/beaa17598bfac03536c782c41a721dc1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<pre><code>B_IN0 \u2192 \u0431\u0438\u0442 0 (0x0001)B_IN1 \u2192 \u0431\u0438\u0442 1 (0x0002)...B_IN15 \u2192 \u0431\u0438\u0442 15 (0x8000)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435: \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 TX-\u0444\u0440\u0435\u0439\u043c\u0430 \u0447\u0435\u0440\u0435\u0437 CAN_INTERFACE \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 <code>%MW{INPUT_ADDRESS}<\/code> \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0440\u0435\u043b\u0435, \u0444\u043b\u0430\u0433\u043e\u0432 \u0446\u0438\u043a\u043b\u0430 \u0438 \u0442.\u0434. &#8212; \u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0440\u0430\u0437\u0443 16 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c CAN-\u0444\u0440\u0435\u0439\u043c\u0435.<\/p>\n<p><code><strong>WORD_ON_BOOL<\/strong><\/code> &#8212; \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f: \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 <code>WORD_IN<\/code> \u0432 16 \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u0432\u044b\u0445\u043e\u0434\u043e\u0432 (<code>B_OUT0<\/code>\u2026<code>B_OUT15<\/code>), \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 <code>AND<\/code>:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5fd\/496\/1e9\/5fd4961e9147363e620f3ef875acdeb9.png\" width=\"148\" height=\"358\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5fd\/496\/1e9\/5fd4961e9147363e620f3ef875acdeb9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5fd\/496\/1e9\/5fd4961e9147363e620f3ef875acdeb9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<pre><code>\u0431\u0438\u0442 0 \u2192 B_OUT0\u0431\u0438\u0442 1 \u2192 B_OUT1...\u0431\u0438\u0442 15 \u2192 B_OUT15<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435: \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u0451\u043c\u0430 RX-\u0444\u0440\u0435\u0439\u043c\u0430 \u0447\u0435\u0440\u0435\u0437 CAN_INTERFACE \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c <code>%MW{OUTPUT_ADDRESS}<\/code> \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e &#8212; \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0438\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0431\u0443\u043b\u0435\u0432\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a \u043a\u0430\u0442\u0443\u0448\u043a\u0435 \u0440\u0435\u043b\u0435 \u0438\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0432 Ladder-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u0434\u0438\u043d CAN-\u0444\u0440\u0435\u0439\u043c (8 \u0431\u0430\u0439\u0442 = 4 \u0441\u043b\u043e\u0432\u0430) \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043e 64 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 4 \u0441\u043b\u043e\u0432\u0430 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0438 \u0431\u043b\u043e\u043a\u0438.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 CAN_INTERFACE \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435<\/h2>\n<p>\u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 <code>main<\/code> \u0431\u043b\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u043f\u043e CAN-\u0448\u0438\u043d\u0435: \u043f\u0440\u0438\u0451\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u0438 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0435\u043b\u0435 \u041a1, \u041a2.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/400\/7e7\/fba\/4007e7fba9d5ede07fb2b0647db4a69e.png\" width=\"663\" height=\"434\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/400\/7e7\/fba\/4007e7fba9d5ede07fb2b0647db4a69e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/400\/7e7\/fba\/4007e7fba9d5ede07fb2b0647db4a69e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 CAN<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0410\u0434\u0440\u0435\u0441<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>CMD_WORD<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>%MW0<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>WORD<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">RX: \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>CYRCLE_STATE<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>%MW1<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>WORD<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0448\u0430\u0433 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>CAN_STATE<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>%MW2<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>WORD<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">TX: \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u041f\u041b\u041a<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>CAN_ERR<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>BOOL<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 CAN<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u043b\u043e\u043a\u0430 CAN_INTERFACE0<\/h4>\n<p>\u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0441\u043e\u0437\u0434\u0430\u043d \u043e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u043b\u043e\u043a\u0430 &#8212; <code>CAN_INTERFACE0<\/code>:<\/p>\n<ul>\n<li>\n<p><code>OUTPUT_ADDRESS = 0<\/code> \u2192 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0439 CAN-\u0444\u0440\u0435\u0439\u043c \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 <code>%MW0<\/code> (<code>CMD_WORD<\/code>)<\/p>\n<\/li>\n<li>\n<p><code>NUM_OF_OUTPUT = 1<\/code> \u2192 \u043e\u0434\u0438\u043d <code>uint16_t<\/code> \u0438\u0437 payload<\/p>\n<\/li>\n<li>\n<p><code>INPUT_ADDRESS = 1<\/code> \u2192 TX-\u0444\u0440\u0435\u0439\u043c \u0447\u0438\u0442\u0430\u0435\u0442 <code>%MW1<\/code> (<code>CYRCLE_STATE<\/code>) \u0438 <code>%MW2<\/code> (<code>CAN_STATE<\/code>)<\/p>\n<\/li>\n<li>\n<p><code>NUM_OF_INPUT = 2<\/code> \u2192 \u0434\u0432\u0430 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0435<\/p>\n<\/li>\n<li>\n<p><code>ID_FILTER = 300 (0x12C)<\/code> \u2192 CAN ID \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 RX-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0432 <code>CMD_WORD<\/code><\/p>\n<\/li>\n<li>\n<p><code>ID_STATE = 310 (0x136)<\/code> \u2192 CAN ID \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 TX-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u043b\u0435<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<p><strong>RX (\u043f\u0440\u0438\u0451\u043c \u043a\u043e\u043c\u0430\u043d\u0434):<\/strong><\/p>\n<p>\u0423\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0440\u0435\u0439\u043c \u043d\u0430 0x12C ID. \u0411\u043b\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0435 2 \u0431\u0430\u0439\u0442\u0430 payload \u0432 <code>CMD_WORD<\/code> (<code>%MW0<\/code>). \u041f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u043d\u0433\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>CMD_WORD<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>1<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c K1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>2<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c K2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>3<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c K1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>4<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c K2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>5<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0446\u0438\u043a\u043b<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <code>CMD_WORD<\/code> \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code>0<\/code> \u043a\u0430\u0436\u0434\u044b\u0439 scan-\u0446\u0438\u043a\u043b, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.<\/p>\n<p><strong>TX (\u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f):<\/strong><\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0435 <code>STATE_PERIOD<\/code> \u043c\u0441 \u0431\u043b\u043e\u043a \u0447\u0438\u0442\u0430\u0435\u0442 <code>CAN_STATE<\/code> (<code>%MW2<\/code>) \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 0x136 ID. \u0421\u043b\u043e\u0432\u043e <code>CAN_STATE<\/code> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u043e\u043c <code>BOOL_ON_WORD0<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0432 \u0431\u0438\u0442\u044b:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d70\/1b4\/39a\/d701b439ae206b962a6fd9689c17bd6f.png\" width=\"312\" height=\"400\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d70\/1b4\/39a\/d701b439ae206b962a6fd9689c17bd6f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d70\/1b4\/39a\/d701b439ae206b962a6fd9689c17bd6f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0411\u0438\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u0438\u0433\u043d\u0430\u043b<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>K1<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u043b\u0435 K1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>K2<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u043b\u0435 K2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>CYCLE_RUN_SET<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0446\u0438\u043a\u043b \u0430\u043a\u0442\u0438\u0432\u0435\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3\u201315<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u0437\u043d\u0430\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u043b\u0435 \u0438 \u0446\u0438\u043a\u043b\u0430 &#8212; \u0431\u043b\u043e\u043a \u0440\u0430\u0441\u0441\u044b\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0430\u043c.<\/p>\n<h4>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0431\u043b\u043e\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435<\/h4>\n<pre><code>BOOL_ON_WORD0  B_IN0 \u2190 K1  B_IN1 \u2190 K2  B_IN2 \u2190 CYCLE_RUN_SET      \u2502      \u25bc WORD_OUT  CYRCLE_STATE (%MW1)  CAN_STATE (%MW2)      \u2502      \u25bc INPUT_ADDRESS=2CAN_INTERFACE0 \u2500\u2500TX\u2500\u2500\u25ba ID_STATE (\u043a\u0430\u0436\u0434\u044b\u0435 500 \u043c\u0441)      \u2502      \u25bc OUTPUT_ADDRESS=0  CMD_WORD (%MW0)      \u2502      \u25bc  EQ=1 \u2192 SET K1  EQ=2 \u2192 SET K2  EQ=3 \u2192 RST K1  EQ=4 \u2192 RST K2  EQ=5 \u2192 CYCLE_RUN_SET<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 CAN_INTERFACE<\/h2>\n<p>\u041d\u0430 \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 Raspberry pico \u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0440\u043e\u043c <a href=\"https:\/\/habr.com\/ru\/articles\/1023492\/#:~:text=%D1%81%D0%BE%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D1%8B%D0%B5%20%D1%81%20TSMaster%3A-,CANable%20V1.0%20Nano,-%D0%A4%D0%BE%D1%80%D0%BC%2D%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%3A%20Nano\" rel=\"noopener noreferrer nofollow\">CANable V1.0 Nano<\/a>.<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/69ef1aabaeeb010208e13da9\" data-style=\"\" id=\"69ef1aabaeeb010208e13da9\" width=\"\" data-habr-games=\"\"><\/div>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d CAN-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f OpenPLC \u043d\u0430 Raspberry Pi Pico W:<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0431\u0440\u0430\u043d\u0430 \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f MCP2515 \u043f\u043e SPI0 \u0441 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u0439 3.3V<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a CAN_INTERFACE \u043d\u0430 Arduino C++, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u0442 CAN-\u0448\u0438\u043d\u0443 \u043d\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e <code>%MW<\/code> (\u043f\u0440\u0438\u0451\u043c \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 BOOL_ON_WORD \u0438 WORD_ON_BOOL \u0434\u043b\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0432 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f CAN-\u0444\u0440\u0435\u0439\u043c\u0430<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u0441\u044c \u0431\u043b\u043e\u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432 Ladder-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u043b\u0435 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0446\u0438\u043a\u043b\u043e\u043c<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/vladipirogov\/Relay-Control-via-Modbus\" rel=\"noopener noreferrer nofollow\">GitHub<\/a>.<\/p>\n<p><strong>\u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 CAN FD (\u0447\u0435\u0440\u0435\u0437 MCP2518FD) \u2014 \u0434\u043e 64 \u0431\u0430\u0439\u0442 \u0432 \u0444\u0440\u0435\u0439\u043c\u0435 \u0432\u043c\u0435\u0441\u0442\u043e 8<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043b\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e (CANopen-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b)<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430 Core1 RP2040, \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0432 Core0 \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u043a\u0438 \u041f\u041b\u041a<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1028418\/\">https:\/\/habr.com\/ru\/articles\/1028418\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0438\u0438 \u0434\u043b\u044f \u0434\u0435\u043c\u043e-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 OpenPLC. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Raspberry Pi Pico W \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Modbus RTU\/TCP Slave, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0435 \u0447\u0435\u0440\u0435\u0437 Ladder-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0445\u0435\u043c\u0443 CAN-\u0448\u0438\u043d\u0443. \u0427\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438: \u0443\u0437\u0435\u043b Pico W \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c MCP2515 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a CAN-\u0448\u0438\u043d\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 OpenPLC Editor \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 \u0430\u0440\u0434\u0443\u0438\u043d\u043e-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a CAN-\u0448\u0438\u043d\u0435 \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 Ladder-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0447\u0435\u0440\u0435\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435-\u043c\u0430\u0440\u043a\u0435\u0440\u044b %MW.\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f MCP2515 \u043a Raspberry Pi Pico W \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e Pico \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c 3.3V, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 MCP2515 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u044b \u043d\u0430 5V. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 Can bus \u043d\u0430 Orange pi 4 pro \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e can-\u0442\u0440\u0430\u043d\u0441\u0438\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f, \u0438 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0435.\u0423 Pico \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 SPI. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 SPI0. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 OpenPLC \u0438 Arduino IDE \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0432\u044f\u0437\u043a\u0438:MCP2515 PinPico Pin (GPIO)Pico Pin (Physical)\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435VCC3V3 \u0438\u043b\u0438 5VPin 36 \u0438\u043b\u0438 40GNDGND\u041b\u044e\u0431\u043e\u0439 GND (\u043d\u0430\u043f\u0440. Pin 38)\u041e\u0431\u0449\u0430\u044f \u0437\u0435\u043c\u043b\u044fCSGP17Pin 22Chip Select (\u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c)SO (MISO)GP16Pin 21SPI0 RXSI (MOSI)GP19Pin 25SPI0 TXSCKGP18Pin 24SPI0 SCKINTGP20Pin 26\u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043f\u0438\u0442\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e. \u0412\u0441\u0435 CAN-\u043c\u043e\u0434\u0443\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a \u043e\u0434\u043d\u043e\u0439 CAN-\u0448\u0438\u043d\u0435, \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u044d\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u0432 \u0432\u0438\u0434\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0445 \u0448\u0438\u043d\u0430\u0445 \u043c\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b. \u0420\u0430\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 Modbus-\u043c\u043e\u0434\u0443\u043b\u0438 \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b. \u0421\u043b\u0435\u0432\u0430 \u0432\u043d\u0438\u0437\u0443 \u0436\u0435\u043b\u0442\u044b\u0439 \u043a\u0440\u0443\u0433 &#8212; \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c PMSM \u0441 \u043f\u043b\u0430\u0442\u043e\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435). \u0412\u0432\u0435\u0440\u0445\u0443 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f Raspberry pi (\u0441\u043c. \u0448\u0438\u043b\u0434 \u0434\u043b\u044f Raspberry pi), \u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u0441\u043b\u0435\u0432\u0430 &#8212; Raspberry Pi Pico W \u0441 \u0434\u0432\u0443\u043c\u044f \u0440\u0435\u043b\u0435.\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 C++ \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430OpenPLC Editor \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043d\u0430 C++. \u042d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0431\u043b\u043e\u043a \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a \u0432 Arduino IDE:void setup() {    \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 &#8212; \u0432 \u043f\u0435\u0440\u0432\u043e\u043c scan-\u0446\u0438\u043a\u043b\u0435.    \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0436\u0435\u043b\u0435\u0437\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u044b\u0445\u043e\u0434\u043e\u0432.}void loop() {    \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 scan-\u0446\u0438\u043a\u043b, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e.    \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430: \u0447\u0442\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043e\u0432, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430, \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u044b\u0445\u043e\u0434\u043e\u0432.}IDE \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 &#8212; \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0431\u043b\u043e\u043a\u0430 (Inputs\/Outputs\/Internals), \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u044f\u0432\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b-\u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0432 \u0442\u0435\u043b\u0435 \u0431\u043b\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c:OUTPUT_VAL = INPUT_VAL * 2.0;\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 (vars-&gt;OUTPUT_VAL) = (vars-&gt;INPUT_VAL) * 2.0. \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e &#8212; \u043d\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e vars \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 setup()\/loop(), \u0447\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 callback-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 &#8212; \u043d\u0438\u0436\u0435).\u0422\u0438\u043f\u044b IEC \u2192 CIEC \u0442\u0438\u043fC \u0442\u0438\u043f\u0420\u0430\u0437\u043c\u0435\u0440BOOLuint8_t (IEC_BOOL)8 \u0431\u0438\u0442INTint16_t (IEC_INT)16 \u0431\u0438\u0442UINTuint16_t (IEC_UINT)16 \u0431\u0438\u0442DINTint32_t (IEC_DINT)32 \u0431\u0438\u0442REALfloat (IEC_REAL)32 \u0431\u0438\u0442LREALdouble (IEC_LREAL)64 \u0431\u0438\u0442WORDuint16_t (IEC_WORD)16 \u0431\u0438\u0442\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435: IEC_BOOL &#8212; \u044d\u0442\u043e uint8_t, \u0430 \u043d\u0435 C++ bool. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441 0, \u0430 \u043d\u0435 \u0441 1.\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0446\u0438\u043a\u043b\u0430\u043c\u0438\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 C++ \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430 \u0431\u043b\u043e\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0441\u0432\u043e\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 scan-\u0446\u0438\u043a\u043b\u0430\u043c\u0438 &#8212; \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0442\u0430\u0439\u043c\u0435\u0440\u044b, \u0444\u043b\u0430\u0433\u0438, \u0431\u0443\u0444\u0435\u0440\u044b).\u041f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u043e\u0434 Arduino-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 Arduino API \u0447\u0435\u0440\u0435\u0437 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430\u0412 OpenPLC editor v4 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0432 Arduino function blocks \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438: ARDUINOCAN_CONF, ARDUINOCAN_WRITE, ARDUINOCAN_WRITE_WORD, ARDUINOCAN_READ. \u041d\u043e \u043f\u043e \u043f\u0440\u0430\u0432\u0434\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u041d\u0430 \u0444\u043e\u0440\u0443\u043c\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e Arduino \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u044d\u0442\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438 \u0447\u0442\u043e \u0442\u0430\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0431\u0430\u0433, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u043a.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043d\u0430 C\/C++. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 &#171;\u041f\u043b\u044e\u0441\u043e\u043c&#187;, \u0432\u044b\u0431\u0440\u0430\u0442\u044c Functional Block, \u0432 \u043f\u043e\u043b\u0435 POU name \u0432\u044b\u0431\u0440\u0430\u0442\u044c C\/C++. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u0432 \u043f\u043e\u043b\u0435 POU name \u0432\u0432\u0435\u0434\u0435\u043c CAN_INTERFACE.\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430\u0418\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\u0422\u0438\u043f\u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fID_FILTER\u0412\u0445\u043e\u0434INTCAN ID \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043b\u043e\u043a \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442300 (0x12C)ID_STATE\u0412\u0445\u043e\u0434INTCAN ID \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0440\u0430\u0441\u0441\u044b\u043b\u0430\u0435\u043c\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u043c310 (0x136)STATE_PERIOD\u0412\u0445\u043e\u0434INT\u041f\u0435\u0440\u0438\u043e\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 ID_STATE-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043c\u0441500INPUT_ADDRESS\u0412\u0445\u043e\u0434INT\u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e %MW, \u0447\u044c\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 TX-\u0444\u0440\u0435\u0439\u043c2 \u2192 %MW2NUM_OF_INPUT\u0412\u0445\u043e\u0434INT\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e %MW-\u0441\u043b\u043e\u0432, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 TX-\u0444\u0440\u0435\u0439\u043c (ID_STATE)2OUTPUT_ADDRESS\u0412\u0445\u043e\u0434INT\u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e %MW, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f payload \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e RX-\u0444\u0440\u0435\u0439\u043c\u04300 \u2192 %MW0NUM_OF_OUTPUT\u0412\u0445\u043e\u0434INT\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e %MW-\u0441\u043b\u043e\u0432, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u044b\u0445 \u0438\u0437 RX-\u0444\u0440\u0435\u0439\u043c\u0430 (ID_FILTER)2ERR\u0412\u044b\u0445\u043e\u0434BOOLTRUE, \u0435\u0441\u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f CAN-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u043e\u0439FALSE\u0412\u0441\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0431\u043b\u043e\u043a\u0430. \u0410 \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043a\u043e\u0434\u0430\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u0440\u0435\u0434\u044b: OpenPLC + matiec + Arduino SDKOpenPLC Editor 4 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 matiec (\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 IEC 61131-3), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u044f\u0437\u044b\u043a\u0430\u0445 ST\/LD\/FBD \u0432 C-\u043a\u043e\u0434. \u0414\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Raspberry Pi Pico W \u044d\u0442\u043e\u0442 C-\u043a\u043e\u0434 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 Arduino Sketch \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 arm-none-eabi-gcc.\u042d\u0442\u0430\u043f\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:OpenPLC Editor    \u2502    \u25bc[matiec compiler]    \u2502  IEC 61131-3 (ST\/LD) \u2192 C-\u043a\u043e\u0434    \u25bc build\/Raspberry Pico W\/src\/    \u251c\u2500\u2500 POUS.c \/ Config0.c \/ Res0.c   \u2190 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 PLC    \u251c\u2500\u2500 glueVars.c                     \u2190 int_memory[], bool_input[][], etc.    \u2514\u2500\u2500 LOCATED_VARIABLES.h           \u2190 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f %MW, %MX, %IX, %QX    \u2502    \u25bc[code generator: xml2st \/ jinja2]    \u2502  \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u0434\u043b\u044f C++ \u0431\u043b\u043e\u043a\u043e\u0432    \u25bc build\/Raspberry Pico W\/examples\/Baremetal\/   \u2190 sketch-\u043f\u0430\u043f\u043a\u0430 (Arduino CLI \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 .cpp\/.c\/.h \u0438\u0437 \u043d\u0435\u0451)    \u251c\u2500\u2500 Baremetal.ino       \u2190 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 sketch    \u251c\u2500\u2500 c_blocks_code.cpp   \u2190 typedef IEC_UINT, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b VARS, \u043c\u0430\u043a\u0440\u043e\u0441\u044b + \u043a\u043e\u0434 \u0438\u0437 .cpp function block    \u251c\u2500\u2500 arduino_libs.h      \u2190 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 #include \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 (DS18B20, MQTT \u0438 \u0442.\u0434.)    \u2514\u2500\u2500 ModbusSlave.cpp     \u2190 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0440\u044f\u0434\u043e\u043c    \u2502    \u25bc[Arduino CLI + pqt-gcc arm-none-eabi]    \u2502  \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0435\u0441\u044c sketch \u0432 .elf \/ .uf2    \u25bc \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0434\u043b\u044f Pico W\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 &#8212; \u0444\u0430\u0439\u043b c_blocks_code.cpp, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e C++ \u0431\u043b\u043e\u043a\u0430:\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 CAN_INTERFACE_VARS \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043d\u0430 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u044b-\u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b (#define ID_FILTER (*(vars-&gt;ID_FILTER)))\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 can_interface_setup(CAN_INTERFACE_VARS*) \u0438 can_interface_loop(CAN_INTERFACE_VARS*)\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 &#8212; \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437 .cpp \u0444\u0430\u0439\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e setup() \/ loop() \u0438\u0437 .cpp \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a can_interface_setup \/ can_interface_loop &#8212; \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 PLC. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u0430 ID_FILTER \u0432 \u043a\u043e\u0434\u0435 &#8212; \u044d\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 vars. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0445 \u0432\u043d\u0435 setup\/loop (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043d\u0443\u0442\u0440\u0438 callback) \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: vars \u0442\u0430\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.\u041f\u043e\u0447\u0435\u043c\u0443 INPUT_ADDRESS \u0438 OUTPUT_ADDRESS &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0441\u043b\u0430, \u0430 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 IEC\u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 IEC 61131-3 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 OpenPLC Editor \u043e\u043d\u0438 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b &#8212; \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u0440\u044f\u043c\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0444\u043e\u0440\u0443\u043c\u0435: \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 VAR_INPUT \u0442\u0438\u043f\u0430 POINTER TO \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ADR() \u0432 Ladder\/ST-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0435\u043b\u044c\u0437\u044f.\u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0431\u043b\u043e\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:INPUT_ADDRESS \u0438 OUTPUT_ADDRESS &#8212; \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 (INT), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0431\u043b\u043e\u043a\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 OpenPLC Editor\u041a\u043e\u0441\u0432\u0435\u043d\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 C++: \u043f\u043e \u0447\u0438\u0441\u043b\u0443-\u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 int_memory[] \u0438 \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e\/\/ \u0412\u043c\u0435\u0441\u0442\u043e \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e (\u043d\u0435\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432 OpenPLC):\/\/   VAR_INPUT addr : POINTER TO WORD; END_VAR\/\/   addr^ := received_value;\/\/ \u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 C++:int idx = OUTPUT_ADDRESS + i;          \/\/ OUTPUT_ADDRESS &#8212; \u043f\u0440\u043e\u0441\u0442\u043e INT \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044bif (idx &lt; MAX_MEMORY_WORDS &amp;&amp; int_memory[idx])    *int_memory[idx] = value;          \/\/ \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c C\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u0443\u044e \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044e &#8212; \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 C++ \u043a\u043e\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430.\u041f\u043e\u0447\u0435\u043c\u0443 int_memory[], \u0430 \u043d\u0435 accessor-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0412 runtime OpenPLC (glueVars.c) \u0432\u0441\u0435 %MW-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439:\/\/ glueVars.c &#8212; \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438IEC_UINT *int_memory[MAX_MEMORY_WORD];  \/\/ MAX_MEMORY_WORD = 20 \u0434\u043b\u044f Pico Wint_memory[n] &#8212; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443 %MWn. \u0417\u0430\u043f\u0438\u0441\u044c \u0432 *int_memory[n] \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 PLC-\u043e\u0431\u0440\u0430\u0437\u0435, \u0434\u0435\u043b\u0430\u044f \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f Ladder-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0438 Modbus.\u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 get_uint_located_variable() \u0432 runtime \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 &#8212; \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 &#8212; extern IEC_UINT *int_memory[] \u0438 \u043f\u0440\u044f\u043c\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438.\u0412\u0430\u0436\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 20 (\u0438\u043d\u0434\u0435\u043a\u0441\u044b 0\u201319). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 %MW20 \u0438 \u0432\u044b\u0448\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 int_memory[] &#8212; \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 PLC \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 %MW0\u2013%MW19.\u041b\u043e\u0433\u0438\u043a\u0430 \u0431\u043b\u043e\u043a\u0430 CAN_INTERFACE\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430\u0412 \u0441\u0440\u0435\u0434\u0443 Arduino IDE \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 arduino-CAN. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438 \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0432 \u043c\u0435\u043d\u044e Examples -&gt; CAN\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u043b\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445: CANSender, CANReceiverCallback. \u0420\u0435\u0448\u0435\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0438\u0445 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043a\u043e\u043b\u043b\u0431\u044d\u043a-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 CAN-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u041d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440 CANReceiver.\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f (setup)void setup() {    CAN.setPins(CAN_CS_PIN, CAN_INT_PIN);    CAN.setClockFrequency(8E6);    if (!CAN.begin(500E3)) {        ERR = true;        return;    }    \/\/ Hardware ID filter: only frames with &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-477560","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/477560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=477560"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/477560\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=477560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=477560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=477560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}