You are on page 1of 9

Chúng ta sẽ tiến hành tính toán chi tiết cho kiểm tra chẵn (Even Parity) và kiểm tra lẻ

(Odd Parity) cho chuỗi "105200382". Để làm điều này, chúng ta sẽ thực hiện các bước
sau:

1. Chuyển đổi chuỗi thành mã ASCII:


 '1' -> 49
 '0' -> 48
 '5' -> 53
 '2' -> 50
 '0' -> 48
 '0' -> 48
 '3' -> 51
 '8' -> 56
 '2' -> 50
2. Tính tổng của các giá trị mã ASCII: 49 + 48 + 53 + 50 + 48 + 48 + 51 + 56 + 50 =
403
3. Kiểm tra chẵn (Even Parity):
 Tổng của giá trị mã ASCII là 403. Để kiểm tra chẵn, chúng ta cần kiểm tra
bit cuối của tổng này.
 Tổng 403 được biểu diễn bằng dạng nhị phân là 110010011.
 Bit cuối cần kiểm tra là 1.
 Do đó, để có kiểm tra chẵn, chúng ta cần thêm một bit 0 vào phía cuối, để
tổng cuối cùng trở thành 1100100110 (110010011 + 0).
 Và chuỗi cuối cùng sẽ là: "1052003820".
4. Kiểm tra lẻ (Odd Parity):
 Tổng của giá trị mã ASCII là 403. Để kiểm tra lẻ, chúng ta cần kiểm tra bit
cuối của tổng này.
 Tổng 403 được biểu diễn bằng dạng nhị phân là 110010011.
 Bit cuối cần kiểm tra là 1.
 Do đó, để có kiểm tra lẻ, chúng ta cần thêm một bit 1 vào phía cuối, để
tổng cuối cùng trở thành 1100100111 (110010011 + 1).
 Và chuỗi cuối cùng sẽ là: "1052003821".

Lưu ý rằng Modbus RTU sử dụng kiểm tra lẻ (Odd Parity) hoặc kiểm tra chẵn (Even
Parity) trong giao tiếp dựa trên cấu hình thiết bị đích. Bạn cần xác định kiểu kiểm tra mà
thiết bị yêu cầu và tạo mã kiểm tra tương ứng. Trong ví dụ trên, chúng ta đã tính toán
cả hai để bạn có thể sử dụng một trong hai theo yêu cầu cụ thể.

Đúng, chúng ta sẽ tính lại tổng của mã ASCII cho chuỗi "105200382":
- '1' có mã ASCII là 49.

- '0' có mã ASCII là 48.

- '5' có mã ASCII là 53.

- '2' có mã ASCII là 50.

- '0' có mã ASCII là 48.

- '0' có mã ASCII là 48.

- '3' có mã ASCII là 51.

- '8' có mã ASCII là 56.

- '2' có mã ASCII là 50.

Tổng của các giá trị mã ASCII:

49 + 48 + 53 + 50 + 48 + 48 + 51 + 56 + 50 = 453

Vậy tổng của các mã ASCII trong chuỗi "105200382" là 453.

1. Mã kiểm tra trừ tuần tự (CRC - Cyclic Redundancy Check):


 Để tính toán CRC, chúng ta cần sử dụng một thuật toán CRC cụ thể được
sử dụng trong Modbus RTU. CRC-16 là một lựa chọn thông thường cho
Modbus RTU.
 Sử dụng thuật toán CRC-16 với dãy "105200382" (đã được chuyển thành
dạng số thập phân) để tính toán mã kiểm tra trừ tuần tự. Bạn cần một thư
viện tính toán CRC hoặc một công cụ trực tuyến để thực hiện tính toán
này.
Vì tính toán CRC yêu cầu sử dụng thuật toán cụ thể, và việc tính toán kiểm tra chẵn và
kiểm tra lẻ sử dụng mã ASCII không hiệu quả, bạn nên sử dụng các thư viện hoặc công
cụ phù hợp để thực hiện tính toán cho mình. Tuy nhiên, tôi đã cung cấp cách chuyển
đổi chuỗi thành mã ASCII và tính tổng cho kiểm tra chẵn và kiểm tra lẻ như một ví dụ cơ
bản.
Để tạo một chuỗi lệnh Modbus RTU RS485 cho chuỗi "105200382" và tính mã kiểm tra
trừ tuần tự (CRC - Cyclic Redundancy Check) của chuỗi này, bạn cần làm các bước sau:

1. Chuyển đổi chuỗi "105200382" thành mã nhị phân. Mã nhị phân của các ký tự là:
 '1' -> 00110001
 '0' -> 00110000
 '5' -> 00110101
 '2' -> 00110010
 '0' -> 00110000
 '0' -> 00110000
 '3' -> 00110011
 '8' -> 00111000
 '2' -> 00110010
2. Ghép toàn bộ chuỗi nhị phân lại:
001100010011000000110101001100100011000000110000001100110011100010
0110010
3. Tính mã kiểm tra trừ tuần tự (CRC) cho chuỗi nhị phân bằng cách sử dụng thuật
toán CRC-16, phù hợp với Modbus RTU. Đây là một quá trình phức tạp và đòi hỏi
tính toán bit theo từng bước. Để thực hiện điều này, bạn có thể sử dụng một
công cụ hoặc thư viện tính toán CRC-16.

Sau khi tính toán mã kiểm tra trừ tuần tự, bạn sẽ có giá trị CRC-16 cho chuỗi
"105200382". Giá trị này sẽ được thêm vào chuỗi trước khi truyền đi qua giao tiếp
Modbus RTU RS485.

Lưu ý rằng tính toán CRC-16 là một phần phức tạp của việc tạo chuỗi Modbus RTU, và
nó thường được thực hiện bằng cách sử dụng thư viện hoặc công cụ phần mềm thích
hợp, vì nó liên quan đến việc tính toán theo thuật toán đặc biệt.

Thuật toán CRC-16 (Cyclic Redundancy Check) được sử dụng trong giao tiếp Modbus
RTU để tính toán mã kiểm tra trừ tuần tự. CRC-16 là một kiểu kiểm tra trừ tuần tự dựa
trên đa thức (polynomial) và hoạt động dựa trên phép toán XOR.

Thuật toán CRC-16 thông thường sử dụng đa thức là 0xA001 (được biểu diễn dưới dạng
số nguyên là 4129). Thuật toán sẽ xử lý từng bit của dữ liệu đầu vào (trong trường hợp
này, chuỗi "105200382") và tính toán giá trị kiểm tra trừ tuần tự.

Dưới đây là cách tính mã kiểm tra trừ tuần tự CRC-16 cho chuỗi "105200382":

1. Bắt đầu với một giá trị CRC ban đầu là 0xFFFF (65535 trong hệ số 10).
2. Xử lý từng bit của dữ liệu theo thứ tự từ trái sang phải (tức là từ bit cao đến bit
thấp).
3. Duyệt qua từng bit của dữ liệu:
 XOR giá trị CRC hiện tại với bit dữ liệu.
 Kiểm tra từng bit của giá trị CRC:
 Nếu bit cuối cùng của CRC là 1, thực hiện một phép XOR với đa
thức 0xA001 (4129).
 Dịch phải CRC một bit.
4. Sau khi xử lý hết tất cả các bit của dữ liệu, giá trị CRC sẽ là giá trị kiểm tra trừ
tuần tự cuối cùng.
5. Đảm bảo giá trị CRC được biểu diễn dưới dạng hai byte (16 bit) và bạn có thể sử
dụng giá trị này để thêm vào cuối chuỗi trước khi truyền đi qua giao tiếp Modbus
RTU.

Tôi khuyên bạn sử dụng một công cụ hoặc thư viện tính toán CRC-16 để thực hiện tính
toán này, vì nó rất phức tạp và đòi hỏi xử lý bit một cách chính xác.
Cụ thể
Dưới đây là cách tính toán mã kiểm tra trừ tuần tự CRC-16 cho chuỗi "105200382" bằng
tay. Chúng ta sẽ sử dụng đa thức CRC-16 chuẩn với giá trị là 0xA001 (hoặc 4129 trong hệ
thập phân).

1. Khởi tạo giá trị CRC ban đầu là 0xFFFF (65535 trong hệ thập phân).
2. Xử lý từng ký tự của chuỗi "105200382" theo thứ tự từ trái qua phải.
3. Đối với mỗi ký tự:
 Chuyển ký tự thành mã ASCII (ví dụ, '1' -> 49).
 XOR giá trị CRC hiện tại với mã ASCII của ký tự.
4. Xử lý từng bit của ký tự:
 Lặp 8 lần (do mỗi ký tự có 8 bit).
 Kiểm tra bit cuối cùng của giá trị CRC hiện tại.
 Nếu bit cuối cùng của CRC là 1, thực hiện XOR với đa thức 0xA001 (4129).
 Dịch phải CRC một bit.
5. Lặp lại bước 3 và 4 cho tất cả các ký tự trong chuỗi "105200382".
6. Sau khi xử lý hết tất cả các ký tự, giá trị CRC là giá trị kiểm tra trừ tuần tự cuối
cùng.
7. Đảm bảo rằng giá trị CRC được biểu diễn dưới dạng hai byte (16 bit). Ví dụ, nếu
giá trị CRC là 0x1A2B (đây chỉ là một ví dụ), thì bạn sẽ có hai byte: 0x1A và 0x2B.
8. Bây giờ bạn có mã kiểm tra trừ tuần tự CRC-16 cho chuỗi "105200382". Bạn có
thể thêm giá trị CRC này vào cuối chuỗi "105200382" trước khi truyền đi qua giao
tiếp Modbus RTU.

Lưu ý rằng quá trình này phức tạp và đòi hỏi tính toán bit một cách chính xác. Điều này
thường được thực hiện bằng cách sử dụng các thư viện hoặc công cụ tính toán CRC-16
để đảm bảo tính chính xác và hiệu quả trong thực hiện.

Cụ thể b3

Chúng ta sẽ xử lý từng ký tự của chuỗi "105200382" theo thứ tự từ trái qua phải.

1. Bắt đầu với giá trị CRC ban đầu là 0xFFFF (65535 trong hệ thập phân).
2. Lấy ký tự đầu tiên của chuỗi, đó là '1'.
3. Chuyển ký tự '1' thành mã ASCII, có giá trị là 49 (đối với '1').
4. XOR giá trị CRC hiện tại với giá trị mã ASCII này (CRC hiện tại là 0xFFFF ban đầu).
0xFFFF XOR 0x0031 (49 trong hệ thập phân) = 0xFFCE
5. Tiếp theo, xử lý ký tự tiếp theo, là '0'.
6. Chuyển ký tự '0' thành mã ASCII, có giá trị là 48 (đối với '0').
7. XOR giá trị CRC hiện tại với giá trị mã ASCII của ký tự này.
0xFFCE XOR 0x0030 (48 trong hệ thập phân) = 0xFFFE
8. Tiếp tục xử lý tất cả các ký tự trong chuỗi "105200382" theo cách tương tự.
9. Sau khi xử lý tất cả các ký tự, giá trị CRC là giá trị kiểm tra trừ tuần tự cuối cùng.
10. Đảm bảo rằng giá trị CRC được biểu diễn dưới dạng hai byte (16 bit) và bạn có
thể sử dụng giá trị này để thêm vào cuối chuỗi "105200382" trước khi truyền đi
qua giao tiếp Modbus RTU.

6. Ký tự tiếp theo là '5':


 Chuyển ký tự '5' thành mã ASCII, có giá trị là 53 (đối với '5').
 XOR giá trị CRC hiện tại với giá trị mã ASCII này: 0xFFFE XOR 0x0035 (53
trong hệ thập phân) = 0xFFCB
7. Ký tự tiếp theo là '2':
 Chuyển ký tự '2' thành mã ASCII, có giá trị là 50 (đối với '2').
 XOR giá trị CRC hiện tại với giá trị mã ASCII của ký tự này: 0xFFCB XOR
0x0032 (50 trong hệ thập phân) = 0xFFF9
8. Tiếp theo là ký tự '0', và chúng ta đã thấy cách xử lý ở trước đó.
9. Tiếp tục với các ký tự '0', '3', '8', và '2' như đã thảo luận ở trước đó.
10. Sau khi xử lý hết tất cả các ký tự, giá trị CRC là giá trị kiểm tra trừ tuần tự cuối
cùng.
11. Đảm bảo rằng giá trị CRC được biểu diễn dưới dạng hai byte (16 bit), ví dụ, nếu
giá trị CRC là 0xFF42, thì bạn sẽ có hai byte: 0xFF và 0x42.
12. Giá trị CRC cuối cùng sẽ là giá trị mã kiểm tra trừ tuần tự CRC-16 cho chuỗi
"105200382". Bạn có thể thêm giá trị này vào cuối chuỗi "105200382" trước khi
truyền đi qua giao tiếp Modbus RTU.

Chúng ta sẽ tiếp tục xử lý ký tự '3' và '8' trong chuỗi "105200382" để tính toán mã kiểm
tra trừ tuần tự CRC-16.

Sau khi xử lý ký tự '0' và '2', giá trị CRC là 0xFFF9. Giờ chúng ta tiếp tục với các ký tự '3'
và '8'.

Ký tự '3':

 Chuyển ký tự '3' thành mã ASCII, có giá trị là 51 (đối với '3').


 XOR giá trị CRC hiện tại (0xFFF9) với giá trị mã ASCII của ký tự này: 0xFFF9 XOR
0x0033 (51 trong hệ thập phân) = 0xFFCA

Ký tự '8':
 Chuyển ký tự '8' thành mã ASCII, có giá trị là 56 (đối với '8').
 XOR giá trị CRC hiện tại (0xFFCA) với giá trị mã ASCII của ký tự này: 0xFFCA XOR
0x0038 (56 trong hệ thập phân) = 0xFFF2
Cộng tuần tự

Sau khi xử lý hết tất cả các ký tự trong chuỗi "105200382", giá trị CRC là 0xFFF2.

Đảm bảo rằng giá trị CRC được biểu diễn dưới dạng hai byte (16 bit). Ví dụ, nếu giá trị
CRC là 0xFFF2, thì bạn sẽ có hai byte: 0xFF và 0xF2.

Để tạo một chuỗi lệnh truyền theo chuẩn Modbus RTU RS485 cho chuỗi "105200382"
với kiểm tra cộng tuần tự, bạn cần thực hiện các bước sau:

1. Chuyển đổi chuỗi "105200382" thành mã ASCII:


 '1' -> 49
 '0' -> 48
 '5' -> 53
 '2' -> 50
 '0' -> 48
 '0' -> 48
 '3' -> 51
 '8' -> 56
 '2' -> 50
2. Tính tổng của các giá trị mã ASCII: 49 + 48 + 53 + 50 + 48 + 48 + 51 + 56 + 50 =
403
3. Đảm bảo rằng giá trị tổng (403) được biểu diễn dưới dạng hai byte (16 bit). Trong
trường hợp này, giá trị là 0x0193 (ví dụ).
4. Chuỗi lệnh Modbus RTU thường chứa dữ liệu và một mã kiểm tra. Dựa trên giá trị
kiểm tra cộng tuần tự 16-bit, bạn cần tạo hai byte để đại diện cho kiểm tra.
5. Byte thấp của kiểm tra (LSB) là 0x93.
6. Byte cao của kiểm tra (MSB) là 0x01.
7. Chuỗi lệnh cuối cùng sẽ bao gồm các byte dữ liệu và byte kiểm tra, ví dụ:
 "105200382" sẽ được biểu diễn dưới dạng mã ASCII.
 Kiểm tra LSB (Byte thấp) là 0x93.
 Kiểm tra MSB (Byte cao) là 0x01.

You might also like