thư viện S7 Sharp7
Nhìn chung là không. Dùng thư viện đã được kiểm chứng sẽ tốt hơn code tự viết, trừ khi bạn có lý do cụ thể để tránh DLL.
Code tự viết (như hiện tại)
- Ưu điểm:
- Không phụ thuộc DLL hay NuGet, chỉ cần thả vài file
.csvào plugin. - Không xung đột phiên bản với plugin khác.
- Nhỏ, dễ đọc, dễ sửa.
- Không phụ thuộc DLL hay NuGet, chỉ cần thả vài file
- Nhược điểm:
- Chưa được kiểm chứng. Lỗi vừa rồi (sai thứ tự byte, gói lệnh ghi sai cấu trúc) là ví dụ điển hình.
- Thiếu nhiều tính năng: đọc nhiều item trong một gói, đọc chuỗi, kiểu DATE/TIME, kết nối lại tự động, S7-1500 với “optimized block access”, v.v.
- Mỗi tag đọc một lần riêng, chậm hơn nhiều so với gom nhiều tag vào một gói.
- Mọi lỗi lạ trên PLC thật đều do bạn tự gỡ.
Thư viện có sẵn
- Sharp7 bản gốc: một file
.csduy nhất, thuần C#, miễn phí, đã chạy trên rất nhiều dự án. Nó cũng không cần DLL nếu bạn chép thẳng file vào. Đây là lựa chọn mình khuyên. - S7.Net Plus (NuGet): API tiện (
plc.Read("DB1.DBD0")), xử lý sẵn thứ tự byte và kiểu dữ liệu. Phải thêm một DLL. - Snap7 (DLL native): nhanh và đầy đủ, nhưng phụ thuộc DLL x86/x64 nên khó triển khai hơn.
Gợi ý: giữ nguyên cấu trúc driver, nhưng thay Sharp7.cs tự viết bằng file Sharp7 gốc. Nó vẫn là C# thuần, không cần DLL, mà đáng tin cậy hơn nhiều. Phần S7ClientDriver.cs (parse địa chỉ, cache, dò tag mảng) chỉ cần chỉnh nhẹ vì Sharp7 gốc đã có sẵn S7.GetRealAt, S7.GetIntAt, v.v. để đọc đúng thứ tự byte.
Nếu bạn muốn, mình sẽ chuyển driver sang Sharp7 gốc. Bạn cần gửi mình file Sharp7.cs gốc, vì máy mình không tải được từ GitHub.
Mình đang thay file Sharp7 tự viết bằng bản gốc, rồi đóng gói lại.
Mình đã chuyển driver sang dùng Sharp7 gốc (bản của fbarresi trên GitHub). Mình chưa biên dịch hay chạy thử với PLC thật vì máy mình không có .NET, nên bạn build thử giúp mình nhé.
Thay đổi
- Bản Sharp7 gốc gồm nhiều file, mình chép vào thư mục dưới tên
Sharp7_*.cs(kèm giấy phép). FileSharp7.cstự viết cũ đã bỏ. Vẫn là C# thuần, không cần DLL hay NuGet. S7ClientDriver.csgiờ giải mã và ghi giá trị bằng các hàm của Sharp7 (GetRealAt,GetIntAt,SetDIntAt, …), nên không còn lỗi sai thứ tự byte.- Các hằng số vùng nhớ cũ đã bị đánh dấu lỗi thời, mình đổi sang
S7AreavàS7WordLength. Tên thuộc tính timeout trong Sharp7 làConnTimeout,RecvTimeout,SendTimeout. - Quy ước địa chỉ giữ như bản trước:
DBDmặc định là REAL, dùng:DINT,:INT… hoặcDB1.DINT0nếu là số nguyên. Khoá chống đọc ghi chồng nhau giữa các luồng vẫn còn trong driver.
Lưu ý khi build
- Bản Sharp7 này nhắm net40 và netstandard2.0. Nếu project của bạn nhắm .NET 6 trở lên thì build bình thường.
- Nếu báo trùng tên
S7với plugin khác, báo mình lỗi đầy đủ. Driver chỉ gọi các hàm của lớpS7kiểu phương thức mở rộng, nên khả năng cao không bị xung đột.
Driver hiện vẫn đọc từng tag một. Nếu muốn nhanh hơn khi có nhiều tag, mình có thể gom nhiều tag vào một gói đọc bằng S7MultiVar đã có sẵn trong Sharp7.

