Hiện tại những vấn đề về môi trường đang là chủ đề được quan tâm của dư luận. Các phương pháp dùng trong xử lí nước thải, nông nghiệp, cung cấp nước, trạm bơm,... đang ngày một được cải tiến. Vậy làm thế nào để tiết kiệm được chi phí và sử dụng có hiệu quả các thiết bị hỗ trợ? Hôm nay BKAII sẽ giới thiệu đến các bạn giao thức truyền thông SDI-12 đang được áp dụng rộng rãi trong các lĩnh vực trên.

Ngoài ra cũng còn có rất nhiều các giao thức truyền thông khác: CANModbus RTU, Modbus TCP, ProfibusProfibus DP, Profibus PA, Hart,.... Các giao thức này cũng đã được BKAII chia sẻ đến các bạn trước đó

Giới thiệu về giao thức SDI-12:


Khái niệm:

SDI-12 (Serial Digital Interface at 1200 baud) là 1 giao thức truyền thông không đồng bộ nối tiếp cho các cảm biến thông minh giám sát dữ liệu môi trường. Các thiết bị này thường có công suất thấp (12V), được sử dụng ở các vị trí từ xa và thường được kết nối với 1 thiết bị ghi dữ liệu hoặc thu thập dữ liệu khác.

Đặc điểm:

  • Giao thức này tuân theo cấu hình Master-Slave, theo đó thiết bị ghi dữ liệu (SDI-12 recorder) yêu cầu cần dữ liệu từ các cảm biến thông minh ( SDI-12 sensors), mỗi ID được xác định bằng 1 địa chỉ duy nhất.
  • Quá trình giao tiếp được thực hiện trên 1 đường dữ liệu đơn trong chế độ half-duplex. Hệ thống địa chỉ số cho phép 1 SDI-Recorder kết nối lên đến 62 cảm biến riêng biệt. Khi SDI-Recorder gọi, chỉ có cảm biến được cấu hình sẵn phù hợp với địa chỉ đó sẽ đáp ứng (handshake), các cảm biến khác trên cùng 1 đường dây sẽ không được đáp ứng và thường nằm ở chế độ “Sleep mode” (low power mode) cho đến khi được gọi.
  • Tất cả các truyền thông SDI-12 được truyền đi trong ASCII ở tốc độ 1200 baud với 7 bit dữ liệu và một bit chẵn lẻ. Tiêu chuẩn cũng chỉ định một giao thức truyền thông cho phép các cảm biến ở trạng thái sleep năng lượng thấp cho đến khi bị đánh thức bởi một tín hiệu ngắt nối tiếp được gửi bởi master.

Ưu nhược điểm:

  • Tính tương thích của cảm biến mà không cần lập trình lại các thiết bị thu thập dữ liệu.
  • Nguồn được cung cấp cho các cảm biến thông qua các interface.
  • Có khả năng thực hiện thuật toán hiệu chỉnh trong bộ cảm biến chính nó và sử dụng EEPROMs chi phí thấp để lưu trữ thông tin.
  • Khả năng training trong SDI-12 đến nhiều bộ cảm biến và SDI-Recorder. 

Ứng dụng:

Giao thức này thường được hỗ trở bởi những cảm biến mức, lưu lượng, cảm biến chất lượng nước, dụng cụ khí tượng, độ ẩm của đất và sinh lý thực vật. Do đó nó thường được ứng dụng trong các ngành về môi trường như xử lý nước thải, nông nghiệp, cung cấp nước, trạm bơm…

Xem thêm:

Trên đây là những kiến thức cơ bản về giao thức truyền thông SDI-12. Hi vọng với những thông tin trên có thể giúp ích cho công việc cũng như việc học tập nghiên cứu của các bạn. Các bạn có thể ghé thăm BKAII để cập nhật những bài viết liên quan nhé!

"BKAII - Thiết bị truyền thông TỐT nhất với giá CẠNH TRANH nhất!"

27.655MBMemory Usage210msRequest Duration
Joomla! Version4.4.13
PHP Version8.1.32
Identityguest
Response200
Templatet3_bs3_blank
Database
Server
mysql
Version
10.11.8-MariaDB
Collation
latin1_swedish_ci
Conn Collation
utf8mb4_general_ci
$_GET
array:2 [ "print" => "1" "tmpl" => "component" ]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
[]
$_SERVER
array:50 [ "PATH" => "/usr/local/bin:/bin:/usr/bin" "HTTP_ACCEPT" => "text/html,application/xhtm...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1751640838 "last" => 1751640838...
registry
array:3 [ "data" => array:3 [ "current_theme" => "red" "current_direction" => "ltr" "c...
user
array:18 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (4.1MB) (24.98ms)
  • afterInitialise (7.13MB) (59.49ms)
  • afterRoute (4.35MB) (28.5ms)
  • beforeRenderComponent com_content (380.19KB) (3.35ms)
  • Before Access::preloadComponents (all components) (477.52KB) (3.63ms)
  • After Access::preloadComponents (all components) (121.71KB) (828μs)
  • Before Access::preloadPermissions (com_content) (4.07KB) (21μs)
  • After Access::preloadPermissions (com_content) (1.1MB) (3.07ms)
  • Before Access::getAssetRules (id:365 name:com_content.article.197) (66.8KB) (68μs)
  • After Access::getAssetRules (id:365 name:com_content.article.197) (26.37KB) (340μs)
  • afterRenderComponent com_content (2.73MB) (25.86ms)
  • afterDispatch (1.93KB) (84μs)
  • afterRender (6.86MB) (59.01ms)
  • 1 x afterInitialise (7.13MB) (28.35%)
    59.49ms
    1 x afterRender (6.86MB) (28.12%)
    59.01ms
    1 x afterRoute (4.35MB) (13.58%)
    28.50ms
    1 x afterRenderComponent com_content (2.73MB) (12.32%)
    25.86ms
    1 x afterLoad (4.1MB) (11.91%)
    24.98ms
    1 x Before Access::preloadComponents (all components) (477.52KB) (1.73%)
    3.63ms
    1 x beforeRenderComponent com_content (380.19KB) (1.6%)
    3.35ms
    1 x After Access::preloadPermissions (com_content) (1.1MB) (1.46%)
    3.07ms
    1 x After Access::preloadComponents (all components) (121.71KB) (0.39%)
    828μs
    1 x After Access::getAssetRules (id:365 name:com_content.article.197) (26.37KB) (0.16%)
    340μs
    1 x afterDispatch (1.93KB) (0.04%)
    84μs
    1 x Before Access::getAssetRules (id:365 name:com_content.article.197) (66.8KB) (0.03%)
    68μs
    1 x Before Access::preloadPermissions (com_content) (4.07KB) (0.01%)
    21μs
37 statements were executed, 15 of which were duplicates, 22 unique13.83ms1.24MB
  • SELECT @@SESSION.sql_mode;54μs1.57KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:334Copy
  • SELECT `data` FROM `idc_session` WHERE `session_id` = ?97μs1.61KBParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:261Copy
  • SELECT `extension_id` AS `id`,`element` AS `option`,`params`,`enabled` FROM `idc_extensions` WHERE `type` = 'component' AND `state` = 0 AND `enabled` = 1282μs1.73KB/libraries/src/Component/ComponentHelper.php:399Copy
  • SELECT `id`,`rules` FROM `idc_viewlevels`90μs976B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `idc_usergroups` AS `a` LEFT JOIN `idc_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest139μs2.27KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `folder` AS `type`,`element` AS `name`,`params` AS `params`,`extension_id` AS `id` FROM `idc_extensions` WHERE `enabled` = 1 AND `type` = 'plugin' AND `state` IN (0,1) AND `access` IN (:preparedArray1,:preparedArray2) ORDER BY `ordering`577μs4.3KBParams/libraries/src/Plugin/PluginHelper.php:294Copy
  • SELECT `m`.`id`,`m`.`menutype`,`m`.`title`,`m`.`alias`,`m`.`note`,`m`.`link`,`m`.`type`,`m`.`level`,`m`.`language`,`m`.`browserNav`,`m`.`access`,`m`.`params`,`m`.`home`,`m`.`img`,`m`.`template_style_id`,`m`.`component_id`,`m`.`parent_id`,`m`.`path` AS `route`,`e`.`element` AS `component` FROM `idc_menu` AS `m` LEFT JOIN `idc_extensions` AS `e` ON `m`.`component_id` = `e`.`extension_id` WHERE ( (`m`.`published` = 1 AND `m`.`parent_id` > 0 AND `m`.`client_id` = 0) AND (`m`.`publish_up` IS NULL OR `m`.`publish_up` <= :currentDate1)) AND (`m`.`publish_down` IS NULL OR `m`.`publish_down` >= :currentDate2) ORDER BY `m`.`lft`5.48ms820.55KBParams/libraries/src/Menu/SiteMenu.php:166Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `idc_categories` AS `s` INNER JOIN `idc_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`320μs5.13KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `id`,`home`,`template`,`s`.`params`,`inheritable`,`parent` FROM `idc_template_styles` AS `s` LEFT JOIN `idc_extensions` AS `e` ON `e`.`element` = `s`.`template` AND `e`.`type` = 'template' AND `e`.`client_id` = `s`.`client_id` WHERE `s`.`client_id` = 0 AND `e`.`enabled` = 1225μs2.45KB/administrator/components/com_templates/src/Model/StyleModel.php:773Copy
  • SELECT * FROM `idc_languages` WHERE `published` = 1 ORDER BY `ordering` ASC130μs2.22KB/libraries/src/Language/LanguageHelper.php:142Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `idc_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39,:preparedArray40,:preparedArray41,:preparedArray42,:preparedArray43,:preparedArray44)494μs8.12KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `idc_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 01.32ms173.8KBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `idc_content`539μs2.39KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:625Copy
  • UPDATE `idc_content` SET `hits` = (`hits` + 1) WHERE `id` = '197'252μs48B/libraries/src/Table/Table.php:1325Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `idc_content` AS `a` INNER JOIN `idc_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `idc_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `idc_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `idc_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `idc_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)332μs24.63KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `idc_categories` AS `s` INNER JOIN `idc_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`275μs5.17KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `idc_contentitem_tag_map` AS `m` INNER JOIN `idc_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1,:preparedArray2)230μs7.72KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `idc_categories` AS `s` INNER JOIN `idc_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`275μs5.17KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM idc_fields AS a LEFT JOIN `idc_languages` AS l ON l.lang_code = a.language LEFT JOIN idc_users AS uc ON uc.id=a.checked_out LEFT JOIN idc_viewlevels AS ag ON ag.id = a.access LEFT JOIN idc_users AS ua ON ua.id = a.created_user_id LEFT JOIN idc_fields_groups AS g ON g.id = a.group_id LEFT JOIN `idc_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2,:preparedArray3)) AND `a`.`access` IN (:preparedArray4,:preparedArray5)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray6,:preparedArray7)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC731μs6.06KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:166Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `idc_categories` AS `s` INNER JOIN `idc_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`274μs5.17KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT * FROM idc_hikashop_config344μs152.94KB/administrator/components/com_hikashop/classes/config.php:16Copy
  • SET sql_mode=(SELECT REPLACE(REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''), 'STRICT_TRANS_TABLES', ''));40μs0B/administrator/components/com_hikashop/helpers/helper.php:3422Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `idc_scheduler_tasks` AS `a` WHERE `a`.`state` = 1128μs1.68KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:517Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id98μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id80μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id78μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id74μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id76μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id79μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id76μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id72μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id75μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id74μs12.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id74μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `alias` FROM `idc_content` WHERE `id` = :id72μs1.63KBParams/components/com_content/src/Service/Router.php:168Copy
  • SELECT `session_id` FROM `idc_session` WHERE `session_id` = ?87μs1.61KBParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:291Copy
  • INSERT INTO `idc_session` (`data`,`time`,`session_id`) VALUES (?, ?, ?)190μs864BParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:318Copy