מדריך מפורט על ניתוח הודעות פרוטוקול תקשורת Modbus
סקירה כללית של פרוטוקול Modbus
מודבוס הוא פרוטוקול תקשורת טורי שפותח על ידי מודיקון (כיום שניידר אלקטריק) בשנת 1979 לתקשורת בין בקרי לוגיקה מתוכנתים (PLC). במשך יותר מארבעה עשורים של אבולוציה, הוא הפך לאחד מפרוטוקולי התקשורת הסטנדרטיים דה פקטו בתחום האוטומציה התעשייתית.
תכונות עיקריות:
- ארכיטקטורת מאסטר/עבד: שרת מאסטר יחיד עם מספר עבדים, שבו המאסטר יוזם בקשות והעבדים מגיבים באופן פסיבי.
- פרוטוקול פתוח: ללא דמי רישוי; כל יצרן יכול ליישם אותו ללא תשלום.
- מצבי שידור מרובים: RTU (בינארי), ASCII (טקסט), TCP (אתרנט).
- תומך בשכבות פיזיות שונות: RS485 (הנפוץ ביותר), RS232, TCP/IP (Ethernet).
- מודל נתונים ברור: ארבעה סוגי אובייקטים - סלילים, כניסות בדידות, אוגרי קלט ואוגרי החזקה.
1.1 השוואה בין שלושה גרסאות פרוטוקול

1.2 אילוצי מפרט פרוטוקול

II. מודל נתונים של Modbus וכללי כתובת
2.1 ארבעה סוגי אובייקטים מבצעיים

2.2 ייצוג כתובת (קריטי!)
יצרנים שונים משתמשים בתוכניות קידוד שונות עבור כתובות מודבוס, שהיא המכשול הנפוץ ביותר ביישומים מעשיים:

משמעות קידומת כתובת (ייצוג סטנדרטי בתעשייה):
- החל מ-0: כתובת פרוטוקול (הקסדצימלית), לדוגמה, 0x0000
- 4 xxxx: אוגרי תחזוקה; לדוגמה, 40001 מציין את כתובת הפרוטוקול של אוגרי התחזוקה 0.
- 3xxxx: אוגר קלט; לדוגמה, 30001 מציין את כתובת הפרוטוקול של אוגר קלט 0. ·
- 0xxxx: סליל; לדוגמה, 00001 מציין את כתובת הפרוטוקול של סליל 0. ·
- 1xxxx: קלט בדיד; לדוגמה, 10001 מציין את כתובת הפרוטוקול של קלט בדיד 0.
2.3 כללי עיבוד ביג דאטה
1.1. מספר מרבי של אוגרים הנקראים לכל פעולה: 125 (קודי פונקציה 0x03/0x04)
2.2. מספר מרבי של סלילים/כניסות בדידות הנקראות לכל פעולה: 2000 (קודי פונקציה 0x01/0x02)
3.3. מספר מרבי של אוגרים שנכתבים אליהם לכל פעולה: 123 (קוד פונקציה 0x10)
4.4. מספר מקסימלי של סלילים שנכתבו לכל פעולה: 1968 (קוד פונקציה 0x0F)
5.5. חריגה ממגבלות אלו דורשת קריאה/כתיבה מבוססת בלוקים; יש לוודא מרווחי קריאה מדורגים כדי למנוע התנגשויות באפיקים.
ג. ניתוח מפורט של הודעות Modbus RTU
יחידת הטרמינל המרוחקת (RTU) היא המכשיר הנפוץ ביותר פרוטוקול שידור Modbus ביישומים תעשייתיים, שימוש בקידוד בינארי ליעילות שידור גבוהה ותאימות עם ממשקים טוריים RS485/RS232. נדרש מרווח שקט מינימלי של 3.5 תווים בין מסגרות כדי להבחין בין גבולות מסגרות.
3.1 מבנה מסגרת מלא של RTU
מסגרת נתוני הוראה מלאה ב-RTU מורכבת מארבעת החלקים הבאים:

3.2 דוגמה להודעת RTU – קריאת אוגרי החזקה (קוד פונקציה 0x03)
[הודעת בקשה] המאסטר קורא את אוגרי ההחזקה של עבד 1 (כתובת התחלתית 0x0001, קורא 3 אוגרי הפעלה):
01 03 00 01 00 03 54 0B
ניתוח בייט-אחר-בייט של הודעת הבקשה:

[הודעת תגובה] תחנת עבדים 1 מחזירה נתונים משלושה אוגרים: 01,03,06,02,2B,00,00,00,64, D5, 87
ניתוח בייט אחר בייט של הודעת התגובה:

3.3 הסבר מפורט על קודי פונקציה סטנדרטיים

3.4 תיאור מפורט של כל פורמט הודעת קוד פונקציה
(1) קריאת סליל / קריאת קלט בדיד (קודי פונקציה 0x01/0x02)
[פורמט מסגרת בקשה] (8 בתים בסך הכל)

[פורמט מסגרת תגובה]

[דוגמה לניתוח מיקום] נתוני התגובה מורכבים מ-3 בתים (סלילים 20-38):

(2) אוגר קריאה/אוגר קלט קריאה (קוד פונקציה 0x03/0x04)
[פורמט מסגרת בקשה] (8 בתים בסך הכל)

[פורמט מסגרת תגובה]

(3) כתוב אוגר החזקה יחיד (קוד פונקציה 0x06)
[פורמט מסגרת בקשה] (סה"כ 8 בתים)

[מסגרת תגובה] זהה למסגרת הבקשה, היא מאשרת כתיבה מוצלחת.
(4) כתיבת מספר אוגרי תחזוקה (קוד פונקציה 0x10)
[פורמט מסגרת בקשה]

[פורמט מסגרת תגובה] (8 בתים בסך הכל): [כתובת][0x10][כתובת התחלה (2 בתים)][מספר (2 בתים)][CRC (2 בתים)]
(5) כתוב סליל יחיד (קוד פונקציה: 0x05)
[פורמט מסגרת בקשה] (8 בתים בסך הכל): רק שני ערכים תקפים נתמכים לכתיבה:
- 0xFF00 – סליל מוגדר למצב פתוח (סגור)
- 0x0000 – סליל מוגדר למצב כבוי (פתוח)

[מסגרת תגובה] זהה למסגרת הבקשה, היא מאשרת כתיבה מוצלחת.
IV. ניתוח מפורט של הודעות Modbus TCP
Modbus TCP פועל דרך פרוטוקול Ethernet TCP/IP, תוך שימוש ביציאה 502 כברירת מחדל. שלא כמו מצב RTU, Modbus TCP משתמש בכותרת MBAP (Modbus Application Protocol) כדי להגדיר גבולות הודעות ואינו דורש אימות CRC (במקום זאת מסתמך על מנגנון בדיקת השגיאות המובנה של פרוטוקול TCP).
4.1 מבנה כותרת MBAP (7 בתים, כלולים בכל חבילות TCP)

4.2 דוגמה להודעת Modbus TCP
[הודעת בקשה] קריאת אוגר ההחזקה של עבד 1 (כתובת התחלתית 0x0000, קריאת 3 ערכים):
00 01 00 00 00 06 01 03 00 00 00 03
ניתוח שדה אחר שדה של הודעת הבקשה:

[הודעת תגובה] העבד מחזיר נתונים משלושה אוגרים:
00 01 00 00 00 09 01 03 06 02 2B 00 00 00 64
ניתוח שדה אחר שדה של הודעת התגובה:

4.3 הבדלים מרכזיים בין מבני חבילות RTU ו-TCP

V. הסבר מפורט על אימות CRC-16
אלגוריתם CRC (בדיקת יתירות מחזורית) הוא מנגנון אימות המסגרת של Modbus RTUs, שנועד לזהות שגיאות במהלך שידור הודעות. הפולינום המייצר את CRC-16 הוא x¹⁶ + x¹⁵ + x² + 1 (שווה ערך ל-0x8005); בפועל, נעשה שימוש בפולינום ההפוך 0xA001.
5.1 שלבי חישוב CRC-16
6.1. אתחול אוגר CRC בן 16 סיביות ל- 0xFFFF
7.2. ביצוע פעולת XOR בין הבייט הראשון ל-8 הביטים הנמוכים של אוגר ה-CRC; אחסן את התוצאה בחזרה ב-8 הביטים הנמוכים של אוגר ה-CRC.
8.3. הזז את אוגר ה-CRC ימינה בביט אחד, תוך מילוי הביטים הגבוהים ב-0; קבע את הביט המוזז (LSB):
9.4. אם הסיבית שהושלכה החוצה היא 0: המשך להזיז ימינה בסיבית אחת בלבד
10.5. אם הסיבית המוזזת היא 1: בצע פעולת XOR בין אוגר CRC לבין 0xA001
11.6. חזור על שלב 3 עד להשלמת עיבוד כל 8 הביטים של הבייט הנוכחי
12.7. קח את הבייט הבא וחזור על שלבים 2-6 עד שכל הבייטים יעובדו. 13.8. לאחר השלמת כל עיבוד הבייטים, החלף את הבייטים הגבוהים והנמוכים של אוגר ה-CRC כדי לקבל את סכום הבדיקה הסופי.
14.9. הוסף את סכום הבדיקה הסופי לסוף ההודעה, כאשר הבית הנמוך ראשון והבית הגבוה אחרון
5.2 דוגמה לחישוב CRC-16 (קוד Python)
ניתן להשתמש ישירות בפונקציית Python הבאה כדי לחשב את סכום הבדיקה CRC-16 עבור Modbus RTU:
def modbus_crc16(נתונים: בתים) -> בתים:
"""ספירת קוד בדיקת Modbus RTU CRC-16 (החזרת שני הבייטים הראשונים עם הסיבית הפחות משמעותית תחילה)"""
crc = 0xFFFF
עבור בייט בנתונים:
crc ^= בייט
עבור _ בטווח (8):
אם crc ו- 0x0001:
crc = (crc >> 1) ^ 0xA001
אַחֵר:
crc >>= 1
# החזר תחילה את הבייט הנמוך, ואחריו את הבייט הגבוה
בתים חוזרים ([crc ו-0xFF, (crc >> 8) ו-0xFF])
# תן דוגמאות אופייניות: ספירה 01 03 00 01 00 03 CRC
מסגרת = בתים ([0x01, 0x03, 0x00, 0x01, 0x00, 0x03])
crc = modbus_crc16(מסגרת)
הדפס(crc.hex()) # ייצוא: 540b (0x54 0x0B)
5.3 מיקום בדיקת CRC בהודעה
שימוש בהודעת בקשה 01 03 00 01 00 03 54 0B כדוגמה:

המקלט מחשב מחדש את ערך ה-CRC של 6 הבייטים הראשונים ומשווה אותו ל-2 הבייטים האחרונים של החבילה. אם הם שונים, מתגלה שגיאת שידור ולא מוחזרת תגובה.
Ⅵ. טיפול בחריגים ופרטי קוד שגיאה
כאשר תחנת עבד אינה יכולה לבצע בקשה מתחנת האב (למשל, עקב קודי פונקציה שאינם נתמכים או כתובת מחוץ לטווח), היא מחזירה מסגרת תגובת חריגה. קוד פונקציית תגובת החריגה הוא = קוד פונקציה מקורי + 0x80 (כלומר, הסיבית הגבוהה ביותר מוגדרת ל-1).
6.1 פורמט תגובה חריגה (RTU)
[כתובת עבד][קוד פונקציה | 0x80][קוד חריג][CRC-16]

6.2 משמעות קודי חריגים סטנדרטיים

6.3 דוגמה לתגובה חריגה
[תרחיש] תחנת האב מבקשת לקרוא אוגר בכתובת לא חוקית מתחנת עבדים 1, ותחנת העבדים מחזירה חריג:
בקשה: 01 03 00 20 00 01 XX XX (קריאת אוגר בכתובת 0x0020);
תגובת חריגה: 01 83 02 C0 F1;
פירוט בייט-אחר-בייט של תגובת החריגה:

VI. מבוא להודעות ASCII של Modbus
מצב Modbus ASCII מקודד את כל בתי הנתונים כשני תווי ASCII (לדוגמה, 0x0F מקודד כ-"0F"). למרות שהוא קריא מאוד, הוא מציע יעילות העברה נמוכה ומשמש בעיקר למטרות ניפוי שגיאות.
7.1 מבנה מסגרת ASCII
פורמט מסגרת ASCII מלא:

7.2 אלגוריתם אימות LRC
שלבים לחישוב LRC (בדיקת יתירות אורכית):
15.1. בצע סיכום בינארי על כל הבייטים של שדה הכתובת, קוד הפונקציה ושדה הנתונים (לא כולל סמני התחלה וסיום).
16.2. התעלמות מסיביות carry (אם התוצאה עולה על 255, התוצאה תעטוף אוטומטית ותשמור רק את 8 הביטים התחתונים).
17.3. חשב את המשלים של תוצאת הסיכום מודולו 1 (כלומר, 0xFF − סכום).
18.4. הגדל את המשלים ב-1 כדי לקבל את קוד בדיקת ה-LRC הסופי (בייט 1).
19.5. יש לקודד את קוד בדיקת ה-LRC כשני תווי ASCII ולהוסיף אותם לסוף ההודעה.
ח. טיפים מעשיים ובעיות נפוצות
8.1 בעיות סדר בתים (Big-Endian/Micro-Endian)
ה תקן מודבוס משתמש בסדר big-endian (כאשר הבייט מסדר גבוה יותר קודם) להעברת נתונים של 16 סיביות או יותר. התקנים מסוימים (למשל, התקנים מסוימים מבוססי ARM) משתמשים בסדר micro-endian; נדרשת המרת סדר בתים כדי למנוע שגיאות ניתוח מספריות.

8.2 מגבלת גודל יחידת רישום (PDU ≤ 253 בתים)

8.3 המלצות להגדרת זמן קצוב לתקשורת ולניסיון חוזר
תצורות מומלצות:
- מרווח זמן ביקורת: מוגדר לפי 2-3 פעמים מזמן התגובה המרבי של העבד (בדרך כלל 100-500 מילישניות) • משך זמן קצוב: טווח מומלץ של 1000-3000 מילישניות, ניתן להתאמה בהתאם למהירות התגובה של העבד
- ניסיונות חוזרים: מגבלה מומלצת של 3; הפעלת אזעקה אם נכשל
- פיקוח מרובה-עבדים: תזמון מרווחי פיקוח מדורגים בין עבדים כדי למנוע התנגשויות באפיק • פסק זמן של בתים: במצב RTU, מרווח תווים העולה על 1.5 תווים נחשב לשגיאת מסגרת
8.4 כלי ניקוי באגים מומלצים
נספח: טבלת עזר מהירה להודעות נפוצות
קריאת סליל (קוד פונקציה 0x01)
[בקשה]: קריאה מתחנת עבדים 1 בכתובת התחלתית 0 (סליל 1), קבלת 8 הודעות סטטוס סליל: 01 01 00 00 00 08 3D CC
[תגובה]: שמונה מצבי סליל: 0x55 (01010101B);
הודעה: 01 01 01 55 94 36
כתיבה לסליל יחיד (קוד פונקציה 0x05)
[בקשה] הגדר את הסליל בכתובת 0 למצב ON (ערך כתיבה 0xFF00):
הודעה: 01 05 00 00 FF 00 8C 3A
[בקשה] הגדר את הסליל בכתובת 0 למצב כבוי (ערך כתיבה 0x0000):
הודעה: 01 05 00 00 00 00 CD CA
[תגובה] זהה למסגרת הבקשה
כתיבה לאוגסטר יחיד (קוד פונקציה 0x06):
[בקשה] כתוב את הערך 0x1234 כדי להירשם בכתובת 0.
הודעה: 01 06 00 00 12 34 XX XX (XX הוא CRC, לחישוב).
[תגובה] זהה למסגרת הבקשה.
כתיבה למספר אוגרים (קוד פונקציה 0x10)
[בקשה]: כתיבה לשני אוגרים החל מכתובת 0 עם ערכים 0x1234 ו-0xABCD בהתאמה.
הודעה: 01 10 00 00 00 02 04 12 34 AB CD XX XX
[תגובה]: החזרת כתובת ההתחלה ומספר האוגרים שנכתבו.
הודעה: 01 10 00 00 00 02 41 C8
קריאת אוגרי קלט (קוד פונקציה 0x04)
[בקשה]: קריאה מעבד 1 בכתובת התחלתית 0, קריאת שני אוגרי קלט
הודעות: 01 04 00 00 00 02 71 CB
[תגובה]: החזרת שני ערכי אוגר קלט
הודעות: 01 04 04 00 64 01 90 XX XX (ערכים חוזרים: 100 ו-400)










