2012-12-31 23 views
5

Tôi đang sử dụng NModbus trong một dự án C#, để đọc & ghi dữ liệu Modbus từ/đến một số thiết bị I/O. Tôi đang sử dụng giao thức TCP/IP Modbus (ModbusIpMaster vv ..) trong chương trình.Modbus Custom Message & Sub chức năng (NModbus, TCP, Subfunctions)

Tôi đã liên lạc thành công với các thiết bị (thông qua cổng Modbus) và có thể sử dụng các phương thức mặc định (ví dụ: các hàm Modbus chung như ReadHoldingRegisters, WriteCoils), để truy cập dữ liệu từ thiết bị và có thể ghi lại chúng. Tại thời điểm này, tất cả những gì tôi có thể làm là các phương thức mặc định của NModbus cho thấy các mã Modbus thường được sử dụng (1, 2, 3, 4 vv ..).

Tôi có hai khó khăn:

1) Các I/O thiết lập các thiết bị và thông tin thêm có thể được truy cập theo mã Modbus 70 (0x46), và có phụ chức năng mà tôi sẽ cần phải sử dụng để đọc và/hoặc viết các thiết lập.

Ví dụ, Func 07 (0x46), Phụ func 6 (0x06), có thể được sử dụng để đặt cài đặt liên lạc của mô-đun. Trong ví dụ này, có 7 byte thông tin được gửi đi, thực hiện các cài đặt (ví dụ: tốc độ truyền, v.v ...)

NModbus không có phương pháp cụ thể cho mã chức năng 'tùy chỉnh' này (70). Vì vậy, từ những gì tôi hiểu, một trong những nhu cầu sử dụng tính năng CustomMessage của NModbus. Tôi đã thử thực hiện CustomMessage và khi sử dụng các mã chức năng Modbus chung (ví dụ 1 hoặc 2), tôi có thể đạt được kết quả tương tự như tôi đang sử dụng các phương thức mặc định của NModbus (tức là CustomMessage đang hoạt động cho đến nay).

Khi tôi thử các mã chức năng khác với mã chung (ví dụ: 1, 2, 3 ...), tôi nhận được tất cả các loại ngoại lệ. Hơn nữa, tôi không biết làm thế nào tôi nên gửi các chức năng phụ với thông điệp!

Khi tôi thêm hàm phụ ngay sau mã chức năng (ví dụ: 70 tiếp theo là 06) và dữ liệu được gửi qua tôi nhận được, ngoại lệ. Tôi thực sự cần sự giúp đỡ từ các chuyên gia trong lĩnh vực này, làm ơn.

Đây là một ngoại lệ rõ ràng hơn:

"ngoại lệ của loại 'Modbus.SlaveException' đã được ném Chức năng Mã số: 198 Exception Code:. 3 - Một giá trị chứa trong các dữ liệu truy vấn lĩnh vực không phải là Giá trị này cho biết một lỗi trong cấu trúc của phần còn lại của một yêu cầu phức tạp, chẳng hạn như vì độ dài ngụ ý là không chính xác. một thanh ghi có giá trị ngoài mong đợi của chương trình ứng dụng, vì MODBUS 01 Giao thứckhông nhận thức được tầm quan trọng của bất kỳ giá trị cụ thể nào của bất kỳ đăng ký cụ thể nào của . "

2) Vấn đề thứ hai là gửi ASCII RS-232 thông điệp thông qua Modbus, nhằm kiểm soát một thiết bị RS-232 được kết nối với COM1 của một module trong đó có khả năng chuyển đổi Modbus tin nhắn. Nói cách khác, tôi đang lập kế hoạch giao tiếp với cổng Modbus, để gửi dữ liệu ASCII đến COM1 của nó, sau đó chuyển dữ liệu sang RS-232 và sau đó giao tiếp với thiết bị RS-232. Bản dịch có nghĩa là xảy ra bên trong cổng vào, vì vậy tất cả những gì tôi cần biết là làm thế nào trên Trái đất tôi có thể gửi các thông điệp này qua, thay đổi theo chiều dài.Tôi không biết làm thế nào có thể, và bắt đầu từ đâu.

+0

Bạn có tìm thấy giải pháp nào cho câu hỏi 2) không? – Norbert

+0

Tôi ước tôi có thể giúp, tôi đã làm Modbus trong quá khứ nhưng nó là tất cả các công cụ phát triển trong nước, giảm thiểu kim loại, không bao giờ sử dụng NModbus ... –

Trả lời

0

Phần - NModbus cho phép bạn tạo một bậc thầy ASCII trên máy khách TCP hoặc UDP.

using (TcpClient client = new TcpClient("127.0.0.1", 502)) 
{ 
    ModbusSerialMaster master = ModbusSerialMaster.CreateAscii(client); 

    // Use the master here 
} 

Đối với phần đầu tiên của câu hỏi, NModbus là điều tuyệt vời cho vấn đề cơ bản, nhưng thiếu lớp trừu tượng cho phép mở rộng tùy ý. Kinh nghiệm của riêng tôi về nó đã kết thúc khi tôi thấy rằng nó sẽ yêu cầu sửa đổi đáng kể để thêm và làm cho hàm GetServerId hoạt động, mặc dù đây là một phần của đặc tả cho Modbus RTU. Giải pháp của tôi là thực hiện lại nó từ đầu, (mất ít thời gian hơn là lấy nguồn NModbus để biên dịch và chạy ở vị trí đầu tiên, do phụ thuộc vào thư viện phần thứ ba để ghi nhật ký, v.v. & thiếu các phần mở rộng cho IEnumerable các lớp học).