Lớp dành riêng cho kho dữ liệu (Server mode)

Một phần của tài liệu Xây dựng mạng truyền thông công nghiệp modbus rtu bằng ngôn ngữ python trên máy tính nhúng linux (Trang 71 - 76)

CHƯƠNG 3: XÂY DỰNG CÁC LỚP DỮ LIỆU VÀ THUẬT TOÁN

3.2. XÂY DỰNG THUẬT TOÁN

3.2.6. Lớp dành riêng cho kho dữ liệu (Server mode)

Kho dữ liệu được dùng để lưu trữ dữ liệu khi máy tính nhúng ở chế độ

server(slave). Đối với chuẩn truyền thông Modbus có 4 kho dữ liệu cần chú ý là kho cho các cuộn dây, các đầu vào, các thanh ghi dữ liệu và cách thanh ghi analog. Hình thức tạo kho dữ liệu được như sau:

Lớp để lưu trữ dữ liệu là stores. Lớp này có các thuộc tính là setvalues, getvalues, init, để lấy giá trị hoặc gán giá trị vào kho.

Lớp context là lớp ngữ cảnh chung, lớp này sẽ bao gồm tất cả các kho. Giống như kho dữ liệu lớn. Muốn qua đến lớp store phải thông qua lớp context. Mục đích của lớp context còn là con trỏ phân loại vị trí. Tự động phân loại dữ liệu sẽ phù hợp với kho nào thông qua mã chức năng.

Hình 3.15: Bố cục kho dữ liệu (1/2)[2]

63

Hình 3.16: Bố cục kho dữ liệu (2/2)[2]

Quá trình làm việc như sau: Sau khi bóc tách được mã chức năng, dữ liệu và địa chỉ.

Tất cả các thông số này được đưa ra để kiểm tra các điều kiện sau:

- Mã chức năng có phù hợp hay không. Nếu phù hợp thì chọn kho tương ứng và cất hoặc lấy dữ liệu.

- Địa chỉ có phù hợp hay không. Nếu không phù hợp thì báo lỗi mã ngoại lệ.

- Giá trị có phù hợp không. Nếu không phù hợp thì báo lỗi mã ngoại lệ.

3.2.6.1 Lớp store

Lớp store chứa 3 chức năng là:

- kiểm tra giá trị giữa địa chỉ (address), giá trị (value) và count.

- Thêm giá trị vào kho theo địa chỉ.

- Lấy giá trị từ kho theo địa chỉ.

Do đó cấu trúc các hàm của kho như sau:

def validate(self, address, count=1):

result = (self.address <= address)

64

result &= ((self.address + len(self.values)) >= (address + count)) return result

def getValues(self, address, count=1):

start = address - self.address

return self.values[start:start + count]

def setValues(self, address, values):

if not isinstance(values, list):

values = [values]

start = address - self.address

self.values[start:start + len(values)] = values

3.2.6.2 Lớp context

Lớp context là lớp ngữ cảnh, chứa các kho. Cần khởi tạo các kho trước khi cho Server hoạt động. Quá trình khởi tạo các kho như hàm __init__. Ngoài ra context còn chứa 3 hàm validate, getvalues, setvalues như store.

Để phân biệt kho từ mã chức năng, lớp context sử dụng hàm decode của chính nó như sau:

__fx_mapper = {2: 'd',4: 'i'}

__fx_mapper.update([(i, 'h') for i in [3, 6, 16, 22, 23]]) __fx_mapper.update([(i, 'c') for i in [1, 5, 15]])

def decode(self, fx):

return self.__fx_mapper[fx]

65

Các hàm ở bản của context:

def __init__(self, *args, **kwargs):

self.store = {}

self.store['d'] = kwargs.get('di', ModbusSequentialDataBlock.create()) self.store['c'] = kwargs.get('co', ModbusSequentialDataBlock.create()) self.store['i'] = kwargs.get('ir', ModbusSequentialDataBlock.create()) self.store['h'] = kwargs.get('hr', ModbusSequentialDataBlock.create()) self.zero_mode = kwargs.get('zero_mode', Defaults.ZeroMode)

def validate(self, fx, address, count=1):

if not self.zero_mode: address = address + 1

_logger.debug("validate[%d] %d:%d" % (fx, address, count)) return self.store[self.decode(fx)].validate(address, count)

def getValues(self, fx, address, count=1):

if not self.zero_mode: address = address + 1

_logger.debug("getValues[%d] %d:%d" % (fx, address, count)) return self.store[self.decode(fx)].getValues(address, count)

def setValues(self, fx, address, values):

if not self.zero_mode: address = address + 1

_logger.debug("setValues[%d] %d:%d" % (fx, address, len(values))) self.store[self.decode(fx)].setValues(address, values)

Như vậy chương 3 đã đưa ra được các lớp để xử lý dữ liệu Lớp Utilities - Lớp Transaction

- Lớp Factory

66

- Lớp Bit_read_messabe.py ; bit_write_message.py register_read_message.py register_write_message.py

- Lớp Physical - Lớp Context - Lớp Store

Trong mỗi lớp đã có các hàm để phục vụ cho việc giải mã dữ liệu, đóng gói khung truyền. Chương 3 cung cấp các hàm cho lớp ứng dụng trên tầng 7 của mô hình OSI, Nhờ vào các hàm này, server và client tự động xử lý dữ liệu và đáp trả mà không cần sự can thiệp nào của người dùng trên lớp 7 (lớp ứng dụng). Đặc tính tự xử lý dữ liệu của các lớp và các hàm đã được xây dựng chính là ưu điểm của phần lập trình.

Từ đó chúng ta tiến đến chương 4 để đánh giá kết quả mô phỏng.

67

Một phần của tài liệu Xây dựng mạng truyền thông công nghiệp modbus rtu bằng ngôn ngữ python trên máy tính nhúng linux (Trang 71 - 76)

Tải bản đầy đủ (PDF)

(100 trang)