Đề tài Tổng quan hệ thống điều khiển tự động

Tài liệu Đề tài Tổng quan hệ thống điều khiển tự động: Tóm tắt nội dung Luận văn trình bày một cách khái quát bài toán cân đóng bao trong công nghiệp cùng cách giải quyết vấn đề, đồng thời, nghiên cứu một số thiết bị phần cứng cũng như các tiêu chuẩn truyền thông được sử dụng trong công nghiệp. Các nghiên cứu này cho phép thiết kế một hệ thống hoàn chỉnh phục vụ cho bài toán cân đóng bao và một số bài toán liên quan. Từ đó luận văn mô tả một cách chi tiết một hệ thống thực đã được tác giả xây dựng và các kết quả triển khai thực tế của nó trong nhà máy công nghiệp. Phần còn lại trình bày các chương trình điều khiển được viết bằng ngôn ngữ lập trình C sử dụng trong bộ điều khiển. Hi vọng, những kiến thức trong luận văn sẽ mang lại cái nhìn rõ ràng nhất cho người đọc về các hệ thống điều khiển tự động nói chung và hệ thống cân đóng bao nói riêng. Mục lục Danh mục hình vẽ Hình 1: Quá trình cân đóng bao 4 Hình 2: Hệ thống cân đóng bao 6 Hình 3: Sơ đồ quá trình cân đóng bao và xung điều khiển tương ứng. 7 Hình 4: Lưu đồ thuật toán quá ...

doc95 trang | Chia sẻ: hunglv | Lượt xem: 1365 | Lượt tải: 1download
Bạn đang xem trước 20 trang mẫu tài liệu Đề tài Tổng quan hệ thống điều khiển tự động, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tóm tắt nội dung Luận văn trình bày một cách khái quát bài toán cân đóng bao trong công nghiệp cùng cách giải quyết vấn đề, đồng thời, nghiên cứu một số thiết bị phần cứng cũng như các tiêu chuẩn truyền thông được sử dụng trong công nghiệp. Các nghiên cứu này cho phép thiết kế một hệ thống hoàn chỉnh phục vụ cho bài toán cân đóng bao và một số bài toán liên quan. Từ đó luận văn mô tả một cách chi tiết một hệ thống thực đã được tác giả xây dựng và các kết quả triển khai thực tế của nó trong nhà máy công nghiệp. Phần còn lại trình bày các chương trình điều khiển được viết bằng ngôn ngữ lập trình C sử dụng trong bộ điều khiển. Hi vọng, những kiến thức trong luận văn sẽ mang lại cái nhìn rõ ràng nhất cho người đọc về các hệ thống điều khiển tự động nói chung và hệ thống cân đóng bao nói riêng. Mục lục Danh mục hình vẽ Hình 1: Quá trình cân đóng bao 4 Hình 2: Hệ thống cân đóng bao 6 Hình 3: Sơ đồ quá trình cân đóng bao và xung điều khiển tương ứng. 7 Hình 4: Lưu đồ thuật toán quá trình cân đóng bao 9 Hình 5: Hệ thống cân phối liệu 9 Hình 6: Mô hình OSI của mạng truyền thông MODBUS 10 Hình 7: Phạm vi định nghĩa của CAN trong mô hình OSI 16 Hình 8: Sơ đồ khối bộ truyền dữ liệu UART. 25 Hình 9: Sơ đồ khối bộ nhận dữ liệu UART. 25 Hình 10: Sơ đồ khối module CAN của dsPIC 30F6010. 27 Hình 11: Bộ định thời của dsPIC 30F6010 29 Hình 12: Sơ đồ khối cấu trúc của PSoC CY8C27433 34 Hình 13: Các khối số của PSOC 35 Hình 14: Sơ đồ khối bộ đếm của PSoC CY8C27433 37 Hình 15: Sơ đồ nguyên lý module UART của PSOC 38 Hình 16: Thiết bị cân Mettler Toledo IND130 39 Hình 17: Các cổng vào ra trên Mettler Toledo IND130 40 Hình 18: Vị trí chốt của RS-232 và RS-485 41 Hình 19: Sơ đồ khối hệ thống cân đóng bao 45 Hình 20: Khối giao tiếp người-máy 46 Hình 21: Khối điều khiển 47 Hình 22: Sơ đồ nguyên lý khối giao tiếp người-máy 49 Hình 23: Sơ đồ nguyên lý khối điều khiển 50 Hình 24: Ảnh tủ điều khiển 51 Hình 25: Ảnh mạch nguồn 52 Hình 26: Ảnh khối giao tiếp người máy 52 Hình 27: Ảnh tủ van khí nén 53 Hình 28: Ảnh khối cân Mettler Toledo IND130 53 Mở đầu Theo định hướng phát triển kinh tế - xã hội của nước ta, Việt Nam phấn đấu đến năm 2020 sẽ trở thành một nước công nghiệp hiện đại. Để hướng tới mục tiêu này, chúng ta đang xây dựng một hệ thống nhà máy, xí nghiệp lớn, hiện đại với các dây chuyền sản xuất, lắp ráp, đóng gói... tương xứng. Trong đó, hệ thống cân đóng bao là một thành phần không thể thay thế trong các nhà máy chế biến, tinh luyện, các khu chế xuất. Các hệ thống này có tính tự động cao, dễ vận hành nhờ được điều khiển bằng máy tính hoặc các bộ vi xử lý. Chúng dễ dàng được cài đặt, quản lý để thực hiện thao tác một cách chính xác với khối lượng nguyên liệu cần đóng gói được đặt trước bởi người vận hành. Việc xây dựng những hệ thống tự động trong công nghiệp nói chung và hệ thống cân đóng bao nói riêng là một hướng đi khả thi và hứa hẹn đem lại hiệu quả kinh tế, ứng dụng cao. Trong điều kiện Việt Nam hiện nay, khi xây dựng các hệ thống điều khiển tự động, nền tảng truyền thông trong hệ thống đều dựa vào các thiết bị đắt tiền của nước ngoài. Luận văn hướng đến việc xây dựng một hệ thống cân đóng bao tự động dựa trên các linh kiện thông dụng, giao tiếp dựa trên các chuẩn truyền thông công nghiệp. Do các yêu cầu về tính khả thi cũng như tính kinh tế, cần lựa chọn một vi điều khiển cùng thuật toán điều khiển hợp lý để khi kết hợp với chuẩn truyền thông sẽ mang lại hiệu quả cao nhất cho hệ thống. Hệ thống sẽ được đưa vào phục vụ sản xuất trong dây chuyền đóng bao của Nhà máy Phân Lân Ninh Bình. Em xin gửi lời cảm ơn chân thành nhất đến Th.S. Đặng Anh Việt, người đã tận tình hướng dẫn và giúp đỡ em rất nhiều trong suốt quá trình làm luận văn. Em cũng xin gửi lời cảm ơn tới TS. Trần Quang Vinh và các cán bộ phòng Robotic cùng toàn thể các thầy cô giáo trong Khoa Điện tử - Viễn thông đã tạo điều kiện tốt nhất để em hoàn thành đề tài này. Hà Nội, 5/2008 Đỗ Anh Tú Tổng quan Đặt vấn đề Trong quá trình công nghiệp hóa – hiện đại hóa ở nước ta hiện nay, việc tự nghiên cứu chế tạo các hệ thống sản xuất, đóng gói tự động trong các nhà máy công nghiệp là một vấn đề cấp thiết. Tuy nhiên, có một thực tế là hầu hết các dây chuyền công nghiệp như vậy đều được nhập từ nước ngoài với chi phí rất cao. Các hệ thống này tuy hoạt động chính xác và quản lý dễ dàng nhưng trong quá trình vận hành có thể gặp trục trặc do điều kiện thời tiết khí hậu nóng ẩm ở nước ta. Khi những sự cố như vậy xảy ra, rất khó để chúng ta tự khắc phục vì mỗi nhà cung cấp thường chọn cho mình những tiêu chuẩn cũng như công cụ phát triển riêng. Do đó, không còn cách nào khác là phải mời các chuyên gia nước ngoài về giải quyết sự cố với chi phí không hề rẻ. Điều đó chắc chắn có ảnh hưởng rất lớn đến khía cạnh kinh tế của nhà sản xuất cũng như của cả nền kinh tế nước ta. Bên cạnh đó, việc giải quyết các bài toán tự động hóa mà cụ thể ở đây là bài toán cân đóng bao là không quá phức tạp và hoàn toàn khả thi, phù hợp với những kiến thức thu được trên giảng đường đại học về điều khiển học, kỹ thuật điện tử, thiết kế mạch hay mạng truyền dữ liệu… Chính vì những lý do đó, tôi muốn hướng đến việc nghiên cứu một hệ thống cân tự động sử dụng trong quá trình đóng gói sản phẩm và giải quyết một số bài toán thực tiễn của hệ thống. Hệ thống này cần được phát triển dựa trên các chuẩn quốc tế để có thể kết nối với các thiết bị khác trong dây chuyền sản xuất. Việc xây dựng thành công một hệ thống như vậy chắc chắn sẽ mang lại hiệu quả kinh tế lớn cũng như phần nào đóng góp vào sự nghiệp công nghiệp hóa – hiện đại hóa đất nước. Bài toán cân đóng bao trong thực tế Cân đóng bao là một bài toán được ứng dụng rất phổ biến ở các nhà máy chế biến thực phẩm, sản xuất xi măng, lọc hóa dầu.v.v…Nguyên liệu sau khi đi qua một số quá trình trở thành thành phẩm sẽ được đóng gói để vận chuyển và đưa ra thị trường tiêu thụ. Vấn đề đặt ra là làm sao để đóng gói nhanh và đồng đều một lượng chính xác nguyên liệu định trước (gọi là lượng đặt). Bên cạnh bài toán cân đóng bao, một bài toán khác cũng thường gặp không kém là bài toán cân phối liệu. Trong bài toán này, người ta phải đổ vào máy trộn một số loại nguyên liệu nào đó với một tỷ lệ nhất định. Thực chất, việc giải bài toán cân phối liệu hoàn toàn dựa trên lời giải của bài toán cân đóng bao, nhưng được áp dụng cho nhiều nguyên liệu một lúc. Sau khi xem xét những bài toán trên có thể nhận thấy việc xây dựng một hệ thống cân tự động như vậy cần được dựa trên những thành phần cơ bản sau: Thiết bị cân chính xác, có độ tin cậy cao. Vi xử lý phù hợp điều khiển toàn bộ hệ thống. Hệ thống board mạch chủ, mạch nguồn, mạch điều khiển. Hệ thống mạng truyền thông (hay còn gọi là bus) đảm bảo kết nối tín hiệu giữa các thành phần với nhau. Một giao diện thân thiện, linh hoạt dễ sử dụng cho người vận hành, chủ yếu là các công nhân trình độ thấp. Nội dung của luận văn Luận văn chia làm 2 phần: phần một gồm các chương 2, 3 nghiên cứu các cơ sở lý thuyết và tính năng các linh kiện chính phục vụ xây dựng các module trong hệ thống. Trong đó, chương 2 trình bày chi tiết quá trình cân đóng bao cũng như lý thuyết về các mạng truyền thông sử dụng trong công nghiệp, chương 3 tập trung nghiên cứu các tính năng của phần cứng (các vi điều khiển và thiết bị cân sử dụng trong hệ thống). phần hai gồm các chương tiếp theo trình bày triển khai cụ thể hệ thống, chương 4 mô tả một hệ thống thực được hướng đến, chương 5 là những kết quả đã đạt được và triển khai ứng dụng trong thực tế.  Nghiên cứu cơ sở lý thuyết Các khái niệm Các trạng thái của quá trình đóng bao Quá trình cân đóng bao Trạng thái sẵn sàng : hệ thống sẵn sàng làm việc, đợi tín hiệu báo có bao. Trạng thái trễ vào bao : hệ thống chờ một khoảng thời gian TTA từ khi có tín hiệu vào bao cho đến khi bắt đầu ra lệnh mở các van xả. Trạng thái xả thô (coarse speed) : cả van xả thô và van xả tinh được mở, dòng liệu chảy với tốc độ lớn. Trạng thái xả tinh (fine speed) : van xả thô đóng, chỉ còn van xả tinh hoặc cửa xả đóng nhỏ lại với hệ thống chỉ có 1 cửa xả, dòng liệu chảy với tốc độ nhỏ. Trạng thái trễ ra bao : hệ thống chờ một khoảng thời gian TE từ khi đóng hết các van (bao đầy) cho đến khi bắt đầu ra lệnh đẩy bao ra. Trạng thái ra bao : hệ thống ra lệnh đẩy bao ra, trong khoảng thời gian TEM, sau đó tự động trở về trạng thái sẵn sàng, chuẩn bị xuất bao tiếp theo. Các biến quá trình Lượng đặt (target weight): khối lượng nguyên liệu cần đổ vào bao để đóng gói và được người điều khiển nhập vào trước khi bắt đầu quá trình. Lượng thực (real weight): khối lượng nguyên liệu thực tế trong bao sau khi kết thúc quá trình. Điểm cắt thô (coarse weight): bộ điều khiển sẽ ra lệnh đóng van xả thô khi khối lượng nguyên liệu trong bao đạt tới giá trị này. Điểm cắt tinh (fine weight): bộ điều khiển sẽ ra lệnh đóng van xả tinh khi khối lượng nguyên liệu trong bao đạt tới giá trị này. Preact: khoảng thời gian chờ để ổn định hệ thống khi kết thúc quá trình. Lượng dư (preact weight): khối lượng nguyên liệu trong các đường ống sẽ tiếp tục đổ xuống bao sau khi đã đóng các van. Sai số = lượng thực – lượng đặt. Sai số này cần nhỏ hơn dung sai cho phép (tolerance). Trạng thái bao bì: có hay không có bao bì. Trạng thái các cửa xả: các cửa xả đóng hay mở. Trạng thái van kẹp bao: van kẹp bao đóng hay mở. Quá trình cân đóng bao: Giải quyết bài toán cân đóng bao là tìm cách điều hòa một cách hợp lý nhất 2 yêu cầu đặt ra: độ chính xác và thời gian, sao cho sai số giữa lượng thực và lượng đặt càng nhỏ càng tốt và thời gian hoàn thành càng ngắn càng tốt.. Để giải quyết bài toán này, người ta lắp đặt cho hệ thống 2 van xả nguyên liệu: van thô và van tinh. Điểm khác nhau giữa 2 kiểu van này là đường kính miệng van (van thô lớn hơn van tinh, đồng nghĩa với lưu lượng nguyên liệu được xả bởi van thô sẽ lớn hơn so với van tinh). Nhiệm vụ của 2 van này do vậy cũng khác nhau. Van thô được sử dụng với mục đích đổ đầy phần lớn lượng nguyên liệu cần đóng gói nhưng do tốc độ chảy nhanh nên không thể điều chỉnh một cách chính xác lượng nguyên liệu mong muốn. Vì thế, người ta cần một van tinh với tốc độ chảy chậm để dễ dàng bù thêm phần nguyên liệu còn thiếu. Các van này được đóng mở bằng xi lanh khí nén. VĐK COARSE FINE DISCHARGE CÂN Giao diện Hệ thống cân đóng bao Quá trình cân đóng bao có thể tóm tắt như sau. Đầu tiên, khi nhận được tín hiệu bắt đầu, hệ thống kiểm tra sự có mặt của của bao bì bằng một sensor quang hoặc một công tắc hành trình. Nếu có bao bì, sensor sẽ gửi tín hiệu về vi điều khiển để quá trình có thể được bắt đầu; nếu không, hệ thống tiếp tục chờ đến khi có bao bì được đặt vào đúng vị trí. Lúc này, lệnh mở các cửa xả nguyên liệu được phát đi, đồng thời cân điện tử bắt đầu làm việc, liên tục gửi số liệu đo được về vi điều khiển. Vi điều khiển so sánh số liệu này với điểm cắt thô định trước và sẽ phát lệnh đóng van thô khi khối lượng bao đạt đến mốc này. Khi đó, van tinh vẫn mở, nhưng dòng liệu chảy vào bao với tốc độ thấp hơn. Vi điều khiển tiếp tục so sánh số liệu thu về từ cân điện tử đến khi khối lượng bao đạt đến điểm cắt tinh để phát lệnh đóng van tinh. Cần lưu ý là điểm cắt tinh luôn nhỏ hơn lượng đặt một chút bởi sau khi đóng van tinh, vẫn còn một lượng nhỏ nguyên liệu tiếp tục đổ xuống bao (cũng vì lý do này mà ta cần một thời gian trễ để ổn định hệ thống và để số liệu từ cân điện tử đưa về vi xử lý được chính xác). Chính lượng nguyên liệu này là nguyên nhân chủ yếu dẫn đến sai số mà ta cần giải quyết. Để giảm sai số trong những lần đóng gói tiếp theo, ta điều chỉnh lại điểm cắt tinh bằng cách gán: Điểm cắt tinh = Điểm cắt tinh cũ – Sai số x 50%. Kết thúc quá trình, vi điều khiển phát lệnh kẹp bao và sau đó đẩy bao ra ngoài. Chu trình đóng bao vừa rồi được lặp đi lặp lại. Như vậy, rõ ràng sai số sẽ giảm và lượng thực sẽ ngày càng tiến gần về lượng đặt qua từng lần đóng bao tiếp theo. Xung đầu ra Target weight Coarse Fine Preact weight Tolerance Coarse Fine TOL detect M1.4 Sơ đồ quá trình cân đóng bao và xung điều khiển tương ứng. Lưu đồ thuật toán Cân ≥ điểm cắt thô. Kiểm tra bao bì. Cân ≥ điểm cắt tinh. Bắt đầu. Mở các cửa xả (thô, tinh). Đóng các van. Đóng van thô. Đợi delay – Thời gian ổn định. Cân. Tính sai số E = lượng thực – lượng đặt. Mở van kẹp bao, ra lệnh đẩy bao. Xác định lại điểm cắt tinh. Cắt tinh = cắt tinh – E x 50% Sai Sai Sai Đúng Đúng Đúng Lưu đồ thuật toán quá trình cân đóng bao Quá trình cân phối liệu Như đã đề cập ở phần trên, việc giải quyết bài toán cân phối liệu không khác so với bài toán cân đóng bao. Giả sử chúng ta cần trộn 3 loại nguyên liệu A, B và C. Khi đó, 3 loại nguyên liệu sẽ được dẫn qua 3 hệ thống van thô và van tinh riêng biệt. Lần lượt các nguyên liệu này được đổ vào máy trộn theo lượng đặt sao cho phù hợp với tỷ lệ đã biết. Một điểm cần lưu ý là do chỉ sử dụng một chiếc cân duy nhất để đo khối lượng nên lượng đặt cho nguyên liệu B được tính bằng tổng lượng thực của nguyên liệu A đã có trong bao với khối lượng nguyên liệu B cần đổ. Tương tự, lượng đặt cho nguyên liệu C được tính bằng tổng lượng thực của nguyên liệu A và B đã có trong bao với khối lượng nguyên liệu C cần đổ. Việc tính sai số cũng được tính toán như quá trình cân đóng bao. Nếu quá trinh lặp lại nhiều lần, dễ thấy rằng sai số sẽ nhỏ dần theo từng lần đổ nguyên liệu. VĐK CÂN 3 rơ-le Hệ thống cân phối liệu Mạng truyền thông công nghiệp Ghép nối thiết bị, trao đổi thông tin là một trong những vấn đề cơ bản trong bất cứ một giải pháp tự động hóa nào. Hệ thống cân đóng bao được xây dựng với một số khối chức năng riêng biệt, được ghép nối với nhau qua một chuẩn truyền thông công nghiệp. Ngoài ra, hệ thống còn phải ghép nối được với máy tính trung tâm phục vụ yêu cầu quản lý sản phẩm. Phần này nghiên cứu một số chuẩn truyền thông được sử dụng rộng rãi trong công nghiệp là Modbus và CAN. Hai chuẩn truyền thông này được rất nhiều hãng sản xuất thiết bị hỗ trợ. Bên cạnh đó, linh kiện phục vụ xây dựng hệ thống cũng thông dụng, giá thành không cao. MODBUS Modbus là một giao thức do hãng Modicon (thuộc AEG và Schneider Automation) nghiên cứu phát triển. Theo mô hình ISO/OSI thì Modbus thực chất là một chuẩn giao thức và dịch vụ thuộc lớp ứng dụng, vì vậy có thể được thực hiện trên các cơ chế vận chuyển cấp thấp như TCP/IP, MAP (Manufacturing Message Protocol), Modbus Plus và ngay cả qua đường truyền nối tiếp RS-232. Mô hình OSI của mạng truyền thông MODBUS Modbus định nghĩa một tập hợp rộng các dịch vụ phục vụ trao đổi dữ liệu quá trình, dữ liệu điều khiển và dữ liệu chuẩn đoán. Tất cả các bộ điều khiển của Modbus đều sử dụng Modbus là ngôn ngữ chung. Modbus mô tả quá trình giao tiếp giữa một bộ điều khiển với các thiết bị khác thông qua cơ chế yêu cầu/đáp ứng. Vì lý do đơn giản nên Modbus có ảnh hưởng tương đối mạnh đối với các hệ PLC của các nhà sản xuất khác. Cụ thể, trong mỗi PLC người ta đều có thể tìm thấy một tập hợp con các dịch vụ đã đưa ra trong Modbus. Đặc biệt trong các hệ thống thu thập dữ liệu và điều khiển giám sát (SCADA), Modbus thường được sử dụng trên các đường truyền RS-232 ghép nối giữa các thiết bị dữ liệu đầu cuối (PLC, PC, RTU) với thiết bị truyền dữ liệu (Modem). Cơ chế giao tiếp Cơ chế giao tiếp ở Modbus phụ thuộc vào hệ thống truyền thông cấp thấp. Cụ thể, có thể phân chia ra hai loại là mạng Modbus chuẩn và Modbus trên các mạng khác (ví dụ TCP/IP, Modbus Plus, MAP). Mạng Modbus chuẩn : Các cổng Modbus chuẩn trên các bộ điều khiển của Modicon cũng như một số nhà sản xuất khác sử dụng giao tiếp nối tiếp RS-232C. Các bộ điều khiển này có thể được nối mạng trực tiếp qua modem. Các trạm Modbus giao tiếp với nhau qua cơ chế chủ/tớ (Master/Slave), trong đó chỉ một thiết bị chủ có thể chủ động gửi yêu cầu, còn các thiết bị tớ sẽ đáp ứng bằng dữ liệu trả lại hoặc thực hiện một hành động nhất định theo như yêu cầu. Các thiết bị chủ thông thường là các máy tính điều khiển trung tâm và các thiết bị lập trình, trong khi các thiết bị tớ có thể là PLC hoặc các bộ điều khiển số chuyên dụng khác. Một trạm chủ có thể thông báo yêu cầu tới riêng một trạm tớ nhất định, hoặc gửi thông báo đồng loạt tới tất cả các trạm tớ. Chỉ trong trường hợp nhận được yêu cầu riêng, các trạm tớ mới gửi thông báo đáp ứng trả lại trạm chủ. Trong một thông báo yêu cầu có chứa địa chỉ trạm nhận, mã hàm dịch vụ bên nhận cần thực hiện, dữ liệu đi kèm và thông tin kiểm lỗi. Modbus trên các mạng khác Trong một số mạng như Modbus Plus và MAP sử dụng Modbus là giao thức cho lớp ứng dụng , các thiết bị có thể giao tiếp theo cơ chế riêng của mạng đó. Ví dụ trong giao tiếp tay đôi (Peer-to-peer), mỗi bộ điều khiển có thể đóng vai trò là chủ hoặc là tớ trong các lần giao dịch (một chu kỳ yêu cầu-đáp ứng) khác nhau. Một trạm có thể cùng lúc có quan hệ logic với nhiều đối tác, vì vậy nó có thể đồng thời đóng vai trò là chủ và tớ trong các giao dịch khác nhau. Nhìn nhận ở mức giao tiếp thông báo, giao thức Modbus vẫn tuân theo nguyên tắc chủ/tớ mặc dù phương pháp giao tiếp mạng cấp thấp có thể là tay đôi. Khi một bộ điều khiển gửi một yêu cầu thông báo thì nó đóng vai trò là chủ và chờ đợi đáp ứng từ một thiết bị tớ. Ngược lại, một bộ điều khiển sẽ đóng vai trò là tớ nếu nó nhận được thông báo yêu cầu từ một trạm khác và phải gửi trả lại đáp ứng. Chu trình yêu cầu - đáp ứng Giao thức Modbus định nghĩa khuôn dạng của thông báo yêu cầu cũng như của thông báo đáp ứng. Một thông báo yêu cầu bao gồm các phần sau: Địa chỉ trạm nhận yêu cầu (0-247), trong đó 0 là địa chỉ gửi đồng loạt. Mã hàm gọi chỉ thị hành động trạm tớ cần thực hiện theo yêu cầu. Dữ liệu chứa các thông tin bổ sung mà trạm tớ cần cho việc thực hiện hàm được gọi. Thông tin kiểm tra lỗi giúp trạm tớ kiểm tra độ vẹn toàn của nội dung thông báo nhận được. Thông báo đáp ứng cũng bao gồm các thành phần giống như thông báo yêu cầu. Địa chỉ ở đây của chính trạm tớ đã thực hiện yêu cầu và gửi lại đáp ứng. Trong trường hợp bình thường, mã hàm được giữ nguyên như trong thông báo yêu cầu và dữ liệu chứa kết quả thực hiện hành động, ví dụ nội dung hoặc trạng thái các thanh ghi. Nếu xảy ra lỗi, mã hàm quay lại được sửa để chỉ thị đáp ứng là một thông báo lỗi, còn dữ liệu mô tả chi tiết lỗi đã xảy ra. Phần kiểm lỗi giúp trạm chủ xác định độ chính xác của nội dung thông báo nhận được. Chế độ truyền Khi thực hiện Modbus trên các mạng khác như Modbus Plus hay MAP, các thông báo Modbus được đưa vào các khung theo giao thức vận chuyển/liên kết dữ liệu cụ thể. Ví dụ, một lệnh được yêu cầu đọc nội dung các thanh ghi có thể được thực hiện giữa hai bộ điều khiển ghép nỗi qua Modbus Plus. Đối với các thiết bị ghép nối qua mạng Modbus chuẩn, có thể sử dụng một trong hai chế độ truyền là ASCII hoặc RTU. Người sử dụng lựa chọn chế độ theo ý muốn, cùng với các tham số truyền thông qua cổng nối tiếp như tốc độ truyền, parity chẵn/lẻ ... Chế độ truyền cũng như các tham số phải giống nhau đối với tất cả các thành viên của một mạng Modbus. Chế độ ASCII Khi các thiết bị trong một mạng Modbus chuẩn giao tiếp với chế độ ASCII (American Standard Code for Information Interchange), mỗi byte trong thông báo được gửi thành hai ký tự ASCII 7 bit, trong đó mỗi ký tự biểu diễn một chữ số hex. Ưu điểm của chế độ truyền này là nó cho phép một khoảng thời gian trống tối đa một giây giữa hai ký tự mà không gây ra lỗi. Cấu trúc của một ký tự khung gửi đi được thể hiện như sau: Start 0 1 2 3 4 5 6 P Stop Mỗi ký tự khung bao gồm: 1 bit khởi đầu (start bit). 7 bit biểu diễn một chữ số hex của byte cần gửi dưới dạng ký tự ASCII (0 -9 và A – F), trong đó bit thấp nhất được gửi đi trước. 1 bit parity chẵn/lẻ, nếu sử dụng parity. 1 bit kết thúc (stop bit) nếu sử dụng parity hoặc 2 bit kết thúc nếu không sử dụng parity. Chế độ RTU Khi các thiết bị trong một mạng Modbus chuẩn được đặt chế độ RTU (Remote Terminal Unit), mỗi byte trong thông báo được gửi thành một ký tự 8 bit. Ưu điểm lớn nhất của chế độ truyền này so với chế độ ASCII là hiệu suất cao hơn. Tuy nhiên, mỗi thông báo phải được truyền thành một dòng liên tục. Cấu trúc một ký tự khung gửi đi được thể hiện như sau: Start 0 1 2 3 4 5 6 7 P Stop Mỗi ký tự khung bao gồm: 1 bit khởi đầu (start bit). 8 bit của byte thông báo cần gửi, trong đó bit thấp nhất được gửi đi trước. 1 bit parity chẵn/lẻ nếu sử dụng parity. 1 bit kết thúc (stop bit) nếu sử dụng parity hoặc 2 bit kết thúc nếu không sử dụng parity). Cấu trúc bức điện Trong mạng Modbus chuẩn, khi một trong hai chế độ truyền được chon, một thông báo sẽ được đóng khung. Mỗi khung bao gồm nhiều ký tự khung như trên. Các ký tự này sẽ được truyền đi liên tục trong chế độ RTU và gián đoạn trong chế độ ASCII. Khung ASCII Trong chế độ ASCII, một thông báo bắt đầu với dấu hai chấm (:), tức ký tự ASCII 3A, và kết thúc bằng hai dấu quay lại – xuống dòng (CRLF), tức hai ký tự ASCII 0D và 0A. Mỗi byte trong thông báo được truyền đi bằng hai ký tự ASCII, vì vậy các ký tự được phép xuất hiện trong các phần còn lại của khung là 0-9 và A-F. Khởi đầu Địa chỉ Mã hàm Dữ liệu Mã CRC Kết thúc 1 ký tự : 2 ký tự 2 ký tự N ký tự 2 ký tự 2 ký tự CR+LF Mỗi thiết bị tham gia mạng có trách nhiệm liên tục theo dõi đường truyền và phát hiện sự xuất hiện của dấu hai chấm. Khi dấu hai chấm nhận được thì hai ký tự tiếp theo sẽ mang địa chỉ của thiết bị được yêu cầu nhận thông báo hoặc thiết bị đã gửi thông báo đáp ứng. Khoảng cách thời gian tối đa cho phép giữa hai ký tự trong một thông báo là một giây. Nếu vượt quá trị này, bên nhận sẽ coi là lỗi. Khung ASCII sử dụng phương pháp LRC (Longitudinal Redudancy Check) để kiểm lỗi. Khung RTU Trong chế độ RTU, một thông báo bắt đầu với một khoảng trống yên lặng tối thiểu là 3,5 thời gian ký tự. Ô đầu tiên được truyền sẽ là 8 bit địa chỉ, sau đó đến 8 bit mã hàm, một số byte tùy ý dữ liệu và cuối cùng là thông tin kiểm tra lỗi CRC. Sau khi truyền ký tự cuối cùng, khung thông báo cũng phải được kết thúc bằng một khoảng yên lặng tối thiểu là 3,5 thời gian ký tự trước khi bắt đầu một thông báo mới. Khởi đầu Địa chỉ Mã hàm Dữ liệu Mã CRC Kết thúc (----) 8 bit 8 bit N x 8 bit 16 bit (----) Khác với chế độ ASCII, toàn bộ khung thông báo RTU phải được truyền thành một dòng liên tục. Nếu một khoảng trông yên lặng lớn hơn 1,5 thời gian ký tự xuất hiện trước khi truyền xong toàn bộ khung, thiết bị nhận sẽ hủy bỏ thông báo chua đầy đủ đó và cho rằng byte tiếp theo sẽ là địa chỉ của một thông báo mới. Bảo toàn dữ liệu Mạng Modbus chuẩn sử dụng hai biện pháp bảo toàn dữ liệu ở hai mức: kiểm soát khung thông báo và kiểm soát ký tự khung. Đối với hai chế độ truyền ASCII hay RTU. Hơn thế nữa, cả khung thông báo lại được kiểm soát một lần nữa bằng mã LRC (với ASCII) và mã CRC (với RTU). Kiểm soát LRC Trong chế độ ASCII, phần thông tin kiểm lỗi của khung thông báo dựa trên phương pháp LRC (Longitudinal Redundancy Check). Dãy bit nguồn được áp dụng để tính mã LRC bao gồm phần địa chỉ, mã hàm và phần dữ liệu. Các ô khởi đầu cũng như kết thúc khung không tham gia vào tính toán. Mã LRC ở đây dài 8 bit được tính bằng các cộng đại số toàn bộ các byte của dãy bit nguồn (không để ý đến tràn), sau đó lấy phần bù hai của kết quả. Kiểm soát CRC Mã CRC được áp dụng trong chế độ RTU dài 16 bit. Đa thức phát được sử dụng G = 1010 0000 0000 0001. Khi đưa vào khung thông báo, byte thấp của mã CRC được gửi đi trước, tiếp theo là byte cao. CAN CAN (Controller Area Network) là một chuẩn truyền thông công nghiệp được sử dụng rất rộng rãi. Xuất phát là một phát triển chung của hai hãng Bosch và Intel, CAN được dùng để phục vụ việc nối mạng trong các phương tiện giao thông cơ giới để thay thế cách nối điểm - điểm cổ điển, sau được chuẩn hoá quốc tế trong ISO-11898. Trong một số chủng loại ôtô cỡ lớn, chiều dài dây dẫn tổng hợp trong cách nối điểm-điểm có thể lên tới vài kilômét, tính riêng khối lượng dây dẫn lên tới hàng trăm kilôgam. Chỉ cần quan tâm đến các yếu tố này cũng có thể thấy hiệu quả của việc sử dụng một hệ thống bus trường như CAN. Nhờ tốc độ truyền dẫn tương đối cao ở khoảng cách ngắn cũng như ưu thế ở một số đặc tính khác mà công nghệ này cũng đã thâm nhập được vào nhiều lĩnh vực tự động hoá quá trình công nghiệp Kiến trúc giao thức Đối chiếu với mô hình ISO/OSI, CAN định nghĩa lớp liên kết dữ liệu gồm 2 lớp con (LLC và MAC) cũng như phần chính của lớp vật lý . Lớp vật lý đề cập tới việc truyền tín hiệu, vì thế định nghĩa cụ thể phương thức định thời, tạo nhịp bít (bit timing), phương pháp mã hoá bít và đồng bộ hoá. Tuy nhiên, chuẩn CAN không quy định các đặc tính của các bộ thu phát, với mục đích cho phép lựa chọn một trường truyền cũng như mức tín hiệu thích hợp cho từng, lĩnh vực ứng dụng. Lớp điều khiển truy cập môi trường (MAC) là phần cốt lõi trong kiến trúc giao thức CAN. Lớp MAC có trách nhiệm tạo khung thông báo, điều khiển truy cập môi trường, xác nhận thông báo và kiểm soát lỗi. Lớp điều khiển liên kết lôgic (LLC) đề cập tới các dịch vụ gửi dữ liệu và yêu cầu giữ liệu từ xa, thanh lọc thông báo, báo cáo tình trạng quá tải và phục hồi trạng thái. CAL, DeviceNet, SDS Lớp 3 –6 (Không thể hiện) LLC - Điều khiển liên kết kogic MAC - Điều khiên truy nhập môi trường Mã hoá bít, Tạo nhịp/đồng bộ nhịp (Bộ thu phát) Phạm vi định nghĩa của CAN trong mô hình OSI Trong phiên bản CAN2.OB, đặc tả CAN chỉ định nghĩa lớp MAC và một phần lớp LLC. Trong các phiên bản trước đó, hai lớp con của lớp liên kết dữ liệu được gọi là đối tượng (Object Layer) và lớp truyền (Transfer layer). Trong các hệ thống bus tiêu biểu xây dựng trên cơ sở CAN như CANOpen (CAN in Automation), Device.Net (Allen-Bradley) và SDS (Honeywell), giao thức và các dịch vụ của lớp ứng dụng được định nghĩa cụ thể. Cũng như nhiều chuẩn bus trường khác, các lớp từ 3 đến 6 không thể hiện ở CAN. Hầu hết các hệ thống mạng công nghiệp dựa trên cơ sở của CAN thực hiện lớp vật lý theo chuẩn ISO-11898. Các cấu trúc mạng và kỹ thuật truyền dẫn CAN thực chất chỉ là chuẩn giao thức từ phần trên của lớp vật lý cho tới hết lớp liên kết dữ liệu, vì vậy không quy định cụ thể về chuẩn truyền dẫn cũng như môi trường truyền thông. Trên thực tế, cáp đôi dây xoắn kết hợp với chuẩn RS-485 cũng như cáp quang được sử dụng rộng rãi. Đối với cáp đôi dây xoắn, cấu trúc mạng thích hợp nhất là cấu trúc đường thẳng, mắc theo kiểu đường trục/đường nhánh (trunkline/dropline). Trong đó chiều dài đường nhánh hạn chế dưới 0.3m. Tốc độ truyền có thể lựa chọn ở nhiều mức khác nhau, tuy nhiên phải thống nhất và cố định trong toàn bộ mạng. Do có sự ràng buộc giữa tốc độ truyền và chiều dài dây dẫn trong phương pháp truy nhập bus CSMA/CA, tốc độ trưyền tối đa là 1Mbps ở khoảng cách 40 m và 50 Kbps ở khoảng cách 1000m. Số trạm phụ thuộc nhiều vào cấu trúc mạng, cáp truyền và đặc tính điện học của các bộ phận thu phát, thông thường hạn chế ở con số 64 đối với cấu trúc đường thẳng sử dụng đôi dây xoắn. CAN phân biệt hai trạng thái lôgic của tín hiệu là mức trội (dominant) và mức lặn (recessive), tuy nhiên không quy định giá trị bit nào ứng với mức tín hiệu nào, Trong trường hợp cả bít trội và bít lặn được phát đồng thời thì bit trội sẽ lấn át tín hiệu trên bus có mức trội. Trong thực tế, nếu sử dụng mạch AND thì mức trội phải tương ứng với bít 0 và mức lặn tương ứng với bít 1. Trạng thái vật lý (VD điện áp, ánh sáng) thể hiện mức lôgic không được định nghĩa trong chuẩn. Cơ chế giao tiếp Đặc trưng của CAN là phương pháp giao tiếp hướng đối tượng, trong khi hầu hết các hệ thống bus trường khác đều giao tiếp dựa vào địa chỉ các trạm. Mỗi thông tin trao đổi trong mạng được coi như một đối tượng, được gán một mã số căn cước. Thông tin được gửi trên bus theo kiểu truyền thông báo với độ dài có thể khác nhau. Các thông báo không được gửi tới một địa chỉ nhất định mà bất cứ trạm nào cũng có thể nhận theo nhu cầu. Nội dung mỗi thông báo được các trạm phân biệt qua một mã căn cước (IDENTIFER). Mã căn cước không nói lên địa chỉ đích của thông báo mà chỉ biểu diễn ý nghĩa của dữ liệu trong thông báo. Vì thế mỗi trạm trên mạng có thể tự quyết định tiếp nhận và xử lý thông báo hay không tiếp nhận thông báo qua phương thức lọc thông báo (Message Filtering). Cũng nhờ sử dụng phương thức lọc thông báo, nhiều trạm có thể đồng thời nhận cùng một thông báo và có csc phản ứng khác nhau. Một trạm có thể yêu cầu một trạm khác gửi dữ liệu bằng cách gửi một khung REMOTE FRAME. Trạm có khả năng cung cấp nội dung thông tin đó sẽ gửi trả lại một khung dữ liệu DATA FRAME có cùng mã căn cước với khung yêu cầu. Bên cạnh tính đơn giản, cơ chế giao tiếp hướng đối tượng ở CAN còn mang lại tính linh hoạt và tính nhất quán dữ liệu của hệ thống. Một trạm CAN không cần biết thông tin cấu hình hệ thống (ví dụ địa chỉ trạm), nên việc bổ sung hay bỏ đi một trạm trong mạng không đòi hỏi bất cứ một sự thay đổi nào về phần cứng hay phần mềm ở các trạm khác. Trong một mạng CAN có thể rằng một thông báo hoặc được tất cả các trạm quan tâm tiếp nhận đồng thời, hoặc không được trạm nào tiếp nhận. Tính nhất quán dữ liệu được đảm bảo qua các phương pháp gửi đồng loạt và xử lý lỗi. Truy nhập bus CAN sử dụng phương pháp truy nhập môi trường CSMA/CA, tức điều khiển phân kênh theo từng bit. Phương pháp phân mức ưu tiên truy nhập bus dựa theo tính cấp thiết của nội dung thông báo. Mức ưu tiên này phải được đặt cố định, trước khi hệ thống đi vào vận hành. Thực tế mã căn cước không những mang ý nghĩa của dữ liệu trong thông báo, mà còn đồng thời được sử dụng là mức ưu tiên. Bất cứ một trạm nào trong mạng cũng có thể bắt đầu gửi thông báo, mỗi khi đường truyền rỗi. Mỗi bức điện đều bắt đầu bằng một bit khởi điểm và mã căn cước, vì thế nếu hai hoặc nhiều trạm cùng đồng thời bắt đầu gửi thông báo, việc xung đột trên đường truyền sẽ được phân xử dựa theo từng bit của mã căn cước. Mỗi bộ thu phát đều phải so sánh mức tín hiệu của mỗi bit gửi đi với mức tín hiệu quan sát được trên bus. Nếu hai mức tín hiệu có trạng thái logic giống nhau thì trạm có quyền phát bit tiếp theo, trường hợp ngược lại sẽ phải dừng ngay lập tức. Trong trường hợp thực hiện bit giá trị 0 ứng với mức trội và bit giá trị 1 ứng với mức lặn, bit 0 sẽ lấn át. Vì vậy một thông báo có mã căn cước nhỏ nhất sẽ được tiếp tục phát. Hay nói một cách khác, thông báo nào có mã căn cước càng bé thì mức ưu tiên càng cao. Trong trường hợp xảy ra va chạm giữa một thông báo mang dữ liệu (DATA FRAME) và một thông báo yêu cầu gửi dữ liệu (REMOTE FRAME) với cùng mã căn cước, thông báo mang dữ liệu sẽ được ưu tiên. Phương thức phân xử này không những đảm bảo thông tin không bị mất mát, mà còn nâng cao hiệu quả sử dụng đường truyền. Bảo toàn dữ liệu Nhằm đảm bảo mức an toàn tối đa trong truyền dẫn dữ liệu, mỗi trạm CAN đều sử dụng kết hợp nhiều biện pháp để tự kiểm tra, phát hiện và báo hiệu lỗi. Các biện pháp kiểm soát lỗi sau đây được áp dụng. Theo dõi mức tín hiệu của mỗi bit truyền đi và so sánh với tín hiệu nhận được trên bus. Kiển soát qua mã CRC Thực hiện nhồi bit (nhồi một bít nghịch đảo sau năm bit giống nhau) Kiểm soát khung thông báo Với các biện pháp trên, hiệu quả đạt được là: Phát hiện được tất cả các lỗi toàn cục Phát hiện được tất cả các lỗi cục bộ tại bộ phát Phát hiện được tới 5 bit lỗi phân bố ngẫu nhiên trong một bức điện Phát hiện được các lỗi đột ngột có chiều dài nhỏ hơn 15 bit trong một thông báo Phát hiện được các lỗi có số bit là chẵn Tỉ lệ lỗi còn lại (xác suất một thông báo còn bị lỗi không phát hiện) nhỏ hơn 4.7*10-11. Tất cả các trạm nhận thông báo phải kiểm tra sự nguyên vẹn của thông tin và xác nhận thông báo. khi phát hiện ra sự sai lệch trong thông báo, các trạm đều có trách nhiệm truyền khung lỗi. Các thông báo bị lỗi đó sẽ bị dừng và được tự động phát lại. Thời gian hồi phục từ khi phát hiện lỗi đến khi bắt đầu gửi thông báo tiếp theo tối đa là 31 thời gian bit, nếu như không có lỗi xảy ra tiếp theo. Các trạm CAN có khả năng phân biệt giữa nhiễu nhất thời với lỗi kéo dài, ví dụ lỗi khi một trạm có sự cố. Các trạm bị hỏng sẽ được tự động tách ra khỏi mạng (về mặt logic). Mã hoá bit Trước khi được chuyển đổi thành tín hiệu trên đường truyền, CAN sử dụng phương pháp nhồi bit (bit stuffing). Dãy bit đầu vào cần nhồi bao gồm bit khởi đầu khung, ô phân xử, ô điều khiển, dữ liệu và dãy CRC. Khi năm bit liên tục giống nhau, bộ phát sẽ tự động bổ sung một bit nghịch đảo vào cuối. Bên nhận sẽ phát hiện ra bit được nhồi và tái tạo thông tin ban đầu. Việc nhồi bit không được thực hiện với phần còn lại của khung dữ liệu và khung yêu cầu dữ liệu, cũng như đối với các khung lỗi và khung quá tải. Cuối cùng dãy bit được mã hoá theo phương pháp Non-return-to-zero(NRZ), có nghĩa là trong suốt một chu kỳ bit, mức tín hiệu hoặc là trội hoặc là lặn.  Nghiên cứu tính năng phần cứng  Vi điều khiển xử lý tín hiệu số 16 bit DSPIC 30F6010 DSPIC30 là một dòng vi điều khiển 16 bit tích hợp bộ xử lý tín hiệu số 16 bit của hãng Microchip. Với việc tích hợp module xử lý tín hiệu số (Digital Signal Processor) và một lõi vi điều khiển (controller), hãng Microchip đã tạo ra một bộ vi điều khiển có khả năng xử lý các phép tính phức tạp và điều khiển trực tiếp các thiết bị ngoại vi chỉ với một linh kiện duy nhất. Không chỉ làm gọn nhỏ các bo mạch, một chip như vậy còn làm đơn giản việc thiết kế mạch điện tử và đặc biệt là tăng khả năng chống nhiễu cho hệ thống. Trong dòng vi điều khiển dsPIC30, dsPIC 30F6010 với giá thành hợp lý có số lượng đầu vào ra lớn, có sẵn EEPROM phục vụ lưu cấu hình hệ thống. dsPIC 30F6010 được tích hợp các module đặc biệt trong lõi vi điều khiển bộ điều chế độ rộng xung (PWM), bộ biến đổi tín hiệu tương tự - số (ADC), bộ thu phát không đồng bộ UART,... và đặc biệt là bộ điều khiển truyền thông CAN. Cùng với khả năng tính toán mạnh, dsPIC 30F6010 hoàn toàn sẵn sàng cho cả những bài toán đóng bao phức tạp như phải tính tốc độ dòng chảy, phát hiện lỗi bao.... Các tính năng chính CPU với tập lệnh được đơn giản hóa RISC: Kiến trúc Harvard có hiệu chỉnh. Tập lệnh tối ưu cho ngôn ngữ lập trình C với chế độ địa chỉ linh hoạt. Tập lệnh gồm 84 lệnh cơ bản với độ dài lệnh 24 bit, độ dài dữ liệu 16 bit. 144 KB bộ nhớ Flash, có thể nạp lại nhiều lần. 8 KB bộ nhớ RAM. 4 KB bộ nhớ EEPROM cho phép lưu các tham số mà không cần nguồn nuôi. Tốc độ xử lý tối đa 30 triệu lệnh trong 1 giây (30MIPs). 44 nguồn tạo ngắt với 3 nguồn ngoài, 8 mức ưu tiên. 16 thanh ghi 16 bit. Module xử lý tín hiệu số DSP được tích hợp: Nhập dữ liệu kép. 2 bộ tích lũy 40 bit với lựa chọn bão hòa logic phục vụ hoạt động khối DSP. Chế độ định địa chỉ đảo bit và module. Bộ nhân bằng phần cứng 17 x 17 bit chỉ trong 1 chu kỳ lệnh đơn. Tất cả lệnh DSP thực hiện trong một chu kỳ đơn. Các ngoại vi tích hợp trên chip : Các chân vào/ra có khả năng chịu dòng cao: 25mA. 5 module định thời (Timer) với tần số xung clock có thể chia được và cấu hình thành 1 cặp Timer 16 bit hoặc 1 Timer 32 bit. Bộ điều chế độ rộng xung (PWM) với độ phân giải 16 bit. Module truyền dữ liệu SPI qua 3 dây dẫn (hỗ trợ chế độ 4 khung truyền). Module truyền dữ liệu I2C hỗ trợ chế độ đa chủ/tớ và các chế độ định địa chỉ 7 bit/ 10 bit. 2 module truyền thông nối tiếp (UART) với bộ đệm FIFO. Module truyền thông CAN tương thích chuẩn 2.0B. Module điều khiển PWM: 8 cổng vào/ra PWM với các chế độ bù hoặc đầu ra độc lập và các chế độ sườn xung hoặc trung tâm. 4 khối tạo chu kỳ làm việc khác nhau. Cơ sở thời gian riêng biệt với toàn chip. Đầu ra phân cực lập trình được. Hỗ trợ ngắt cho việc cập nhật không đối xứng trong chế độ trung tâm. Bộ so sánh sự kiện đặc biệt cho việc lập lịch những sự kiện ngoại vi khác. Module encoder với góc 90˚(QEI). 3 kênh đầu vào cho hai tín hiệu pha A và B và xung chỉ số. Bộ đếm tăng/giảm vị trí 16 bit. Đếm số lần đảo chiều. Đo vị trí với chế độ x2 và x4. Bộ lọc nhiễu trên đầu vào có thể lập trình. Lựa chọn chế độ Timer/Counter 16 bit. Các ngắt QEI. Các module tương tự: 4 bộ chuyển đổi tín hiệu tương tự - số (ADC) 10 bit với tốc độ lấy mẫu lên tới 500Ksps, 16 kênh vào và có thể chuyển đổi ngay cả trong chế độ ngủ (sleep). Có thể lâp trình để bảo vệ hệ thống ở điện thế thấp. Có thể lập trình ở mức bảo vệ Brown-out và khởi động lại hệ thống. Các tính năng vi điều khiển đặc biệt: Bộ nhớ chương trình Flash với chu kỳ ghi/xóa tới 10.000 lần. Bộ nhớ EEPROM với chu kỳ ghi/xóa 100.000 lần. Có khả năng tự lập trình lại dưới sự điều khiển của phần mềm. Bộ định thời Watchdog sử dụng bộ giao động RC riêng trên chip tiêu thụ ít năng lượng với độ tin cậy rất cao. Chế độ bảo vệ mã lệnh lập trình được. Có thể lựa chọn các chế độ quản lý năng lượng: Ngủ, chờ và đông hồ luân phiên. Hỗ trợ khả năng lập trình trên bo mạch (In-circurt Serial Programing). Chế tạo theo công nghệ CMOS: Công nghệ Flash với hiệu suất cao. Dải điện áp nguồn rất rộng 2,5V đến 5,5V. Dải nhiệt độ công nghiệp và dải nhiệt độ mở rộng. Tiêu thụ năng lượng rất nhỏ. Module truyền thông không đồng bộ UART Module UART (Universal Asynchronous Receiver/Transmitter), thường được tích hợp trên các vi xử lý hoặc máy tính cũng như dsPIC nói riêng, là một khối phần cứng với chức năng chuyển đổi giữa dạng tín hiệu nối tiếp và tín hiệu song song. UART thường được sử dụng với giao thức truyền thông nối tiếp RS-232 và được kết nối với cổng nối tiếp của các thiết bị ngoại vi. Các đặc điểm chính của module UART : Truyền dữ liệu 8 hoặc 9 bit. Các tùy chọn chẵn, lẻ hoặc không bit chẵn lẻ (cho dữ liệu 8 bit). Một hoặc hai bit Stop. Tích hợp bộ tạo tốc độ Baud đầy đủ 16 bit. Dải tốc độ Baud từ 38 bps đến 1,875 Mbps với tốc độ thực hiện lệnh 30 MHz. Bộ đệm dữ liệu truyền 4 từ đơn. Bộ đệm dữ liệu nhận 4 từ đơn. Phát hiện lỗi chẵn lẻ, lỗi khung truyền và lỗi tràn bộ đệm. Hỗ trợ ngắt cho chế độ dò tìm địa chỉ (bit thứ 9 = 1). Phân chia riêng biệt ngắt truyền và ngắt nhận. Sơ đồ khối bộ truyền dữ liệu UART. Sơ đồ khối bộ nhận dữ liệu UART. Bộ điều khiển truyền thông CAN của dsPIC 30F6010 Module CAN (Controller Area Network) là một giao diện nối tiếp, phù hợp cho việc truyền thông với những module CAN khác hoặc các thiết bị vi điều khiển. Giao thức này được thiết kế để cho phép truyền thông trong môi trường có nhiễu. DSPIC 30F6010có hai mudule CAN với các đặc điểm như sau: Thực hiện giao thức CAN 1.2, CAN 2.0A, CAN 2.0B. Khung dữ liệu chuẩn và mở rộng . Độ dài dữ liệu 0-8 byte. Tốc độ bit có thể lập trình lên tới 1Mbit/s. Hỗ trợ chế độ truyền xa. 2 bộ đệm nhận tín hiệu đầu vào( mỗi bộ lên tới 8 byte dữ liệu). 6 bộ lọc đầy đủ, trong đó 2 bộ lọc liên kết với quyền ưu tiên cao và 4 bộ lọc với quyền ưu tiên thấp. 3 bộ đệm truyền với mức ưu tiên xác định( lên tới 8 byte dữ liệu). Tính năng Wake-up với bộ lọc thông thấp có thể lập trình. Chế độ Loopback có thể lập trình hỗ trợ khả năng tự kiểm tra (self-test). Nguồn khóa có thể lập trình. Kết nối với module Input Capture(IC2 cho cả CAN1 và CAN2) cho thời gian lấy mẫu và đồng bộ mạng. Chế độ tiết kiệm năng lượng. Sơ đồ khối module CAN của dsPIC 30F6010. Module CAN chứa một lõi giao thức và phần điều khiển/đệm bản tin. Lõi giao thức CAN kiểm soát tất cả các chức năng nhận và truyền bản tin trên bus CAN. Bản tin được truyền bằng việc tải đầu tiên các thanh ghi dữ liệu phù hợp. Trạng thái và lỗi có thể được kiểm tra bằng cách đọc các thanh ghi phù hợp. Bất kỳ bản tin nào được phát hiện trên bus CAN đều được kiểm tra lỗi. Module CAN truyền các kiểu khung bản tin khác nhau : Khung dữ liệu chuẩn: Một khung dữ liệu chuẩn được tạo bởi một nút khi nút này muốn truyền dữ liệu. Nó bao gồm một bộ nhận dạng chuẩn 11 bit (Standard Identifier –SID). Khung dữ liệu mở rộng: Tương tự như khung dữ liệu chuẩn nhưng sử dụng bộ nhận dạng chuẩn 18 bit Khung dữ liệu xa: Nó có khả năng đối với một nút đích khi yêu cầu dữ liệu từ một nguồn nào đó. Để thực hiện được điều này, nút đích gửi một bản tin xa với một bộ nhận dạng xác định dữ liệu yêu cầu, nút nguồn dữ liệu phù hợp sau đó sẽ gửi một khung dữ liệu đáp ứng với yêu cầu từ xa này. Khung dữ liệu lỗi: Một khung dữ liệu lỗi được tạo ra bởi bất kỳ nút nào khi phát hiện ra có lỗi trên bus. Một khung lỗi bao gồm 2 trường: một trường cờ lỗi và một trường xác định ranh giới lỗi. Khung dữ liệu quá tải: Một khung dữ liệu quá tải có thể được tạo ra bởi một nút như kết quả của hai điều kiện. Thứ nhất là: Nút này phát hiện ra một bit trội trong nội bộ khung - điều này là bất hợp lệ. Thứ hai là: vì điều kiện nội tại nên nút không có khả năng nhận bản tin tiếp theo. Một nút có thể tạo ra nhiều nhất 2 khung qua tải liên tiếp để trì hoãn việc bắt đầu của bản tin tiếp theo. Không gian nội bộ bản tin: Không gian nội bộ bản tin phân biệt một khung dữ liệu đi đến là từ bản tin tiếp theo hay từ bản tin từ xa. Bộ định thời TIMER DSPIC 30F6010 cung cấp cho người dùng 5 bộ định thời với các chế độ làm việc riêng lẻ 16 bit (Timer1) hay kết hợp thanh cặp trong chế độ 32 bit(Timer2/3 và Timer4/5). Module Timer1 là một bộ định thời 16-bit có thể được sử dụng như bộ đếm (counter) thời gian cho đồng hồ thời gian thực hoặc như một bộ định thời/bộ đếm hoạt động tự do. Timer 16 bit có các chế độ sau : Bộ định thời 16-bit. Bộ đếm đồng bộ 16-bit. Bộ đếm không đồng bộ 16-bit. Ngoài ra, các đặc trưng hoạt động sau cũng được cung cấp: Quản lý cổng thời gian khi đặt trong chế độ tích lũy thời gian đóng kín (Gated Time Accumulation mode). Cài đặt được tỷ lệ chia tần số xung đồng hồ. Hoạt động trong các chế độ Chờ (Idle) và Ngủ (Sleep) của CPU. Ngắt phù hợp với thanh ghi chu kỳ 16-bit và sườn xuống của tín hiệu gate bên ngoài. Các chế độ hoạt động này được lựa chọn bằng cách đặt các bit tương ứng trên thanh ghi SFR 16-bit T1CON. Bộ định thời của dsPIC 30F6010 Module Timer2/3 là một timer 32 bit, được cấu hình bởi 2 timer 16-bit với các chế độ hoạt động có thể lựa chọn được. Các timer này được sử dụng bởi các module ngoại vi như chụp tín hiệu đầu vào (input capture) hay so sánh đầu ra/bộ điều chế độ rộng xung đơn giản(output compare/simple PWM). Timer 32-bit có các chế độ hoạt động như sau: 2 timer 16-bit độc lâp với toàn bộ các chế độ hoạt động của timer 16-bit (trừ bộ đếm không đồng bộ). Bộ định thời 32-bit. Bộ đếm đồng bộ 32-bit. Ngoài ra, các đặc trưng hoạt động sau cũng được cung cấp: Tri-gơ sự kiện ADC (ADC Event Trigger). Quản lý cổng thời gian khi đặt trong chế độ tích lũy thời gian đóng kín (Gated Time Accumulation mode). Cài đặt được tỷ lệ chia tần số xung đồng hồ. Hoạt động trong các chế độ Chờ (Idle) và Ngủ (Sleep) của CPU. Ngắt phù hợp với thanh ghi chu kỳ 32-bit. Các chế độ hoạt động này được lựa chọn bằng cách đặt các bit tương ứng trên thanh ghi SFR 16-bit T2CON và T3CON. Module Timer4/5 cũng tương tự như module Timer2/3 nhưng có những điểm khác biệt như sau: Không hỗ trợ đặc tính ADC Event Trigger. Không được sử dụng bởi các module ngoại vi khác. Các chế độ hoạt động này được lựa chọn bằng cách đặt các bit tương ứng trên thanh ghi SFR 16-bit T2CON và T3CON. Bộ chuyển đổi tương tự - số ADC  DSPIC 30F6010 cung cấp một module ADC tốc độ cao cho phép chuyển đổi tín hiệu đầu vào tương tự sang tín hiệu số 10-bit. Module này dựa trên kiến trúc của thanh ghi xấp xỉ kế tiếp (Successive Approximate Register) với tốc độ lấy mẫu tối đa là 500kbps. Module ADC có 16 lối vào tương tự được hợp kênh bởi 4 bộ khuếch đại lấy và giữ mẫu. Đầu ra của bộ lấy và giữ mẫu là đầu vào của bộ chuyển đổi, nơi tạo ra kết quả. Bộ chuyển đổi A/D là bộ phận duy nhất được phép làm việc khi thiết bị ở chế độ ngủ. Module A/D có các thanh ghi 16-bit : Thanh ghi điều khiển A/D 1 (ADCON1). Thanh ghi điều khiển A/D 2 (ADCON2). Thanh ghi điều khiển A/D 3 (ADCON3). Thanh ghi lựa chọn đầu vào A/D (ADCHS). Thanh ghi cấu hình cổng A/D (ADPCFG). Thanh ghi lựa chon quét đầu vào (ADCSSL). Các thanh ghi ADCON1, ADCON2, ADCON3 điều khiển hoạt động của module A/D. Thanh ghi ADCHS lựa chọn kênh vào để chuyển đổi. Thanh ghi ADPCFG cấu hình cho cổng là đầu vào tương tự hay vào ra số. Thanh ghi ADCSSL chọn đầu vào để quét. Vi điều khiển PSOC Các dòng vi điều khiển PSOC PSoC là một từ viết tắt của cụm từ tiếng Anh Programmable System on Chip, nghĩa là hệ thống khả trình trên một chip. Các chip chế tạo theo công nghệ PSoC cho phép thay đổi được cấu hình đơn giản bằng cách gán chức năng cho các khối tài nguyên có sẵn trên chip. Hơn nữa, nó có thể kết nối tương đối mềm dẻo các khối chức năng với nhau hoặc giữa các khối chức năng với các cổng vào ra. Chính vì vậy mà PSoC có thể thay thế cho rất nhiều chức năng nền của một số hệ thống cơ bản chỉ bằng một đơn chip. Thành phần của chip PSoC bao gồm các khối ngoại vi số và tương tự có thể cấu hình được, một bộ vi xử lý 8 bit, bộ nhớ chương trình (EEROM) có thể lập trình được và bộ nhớ RAM khá lớn. Để lập trình hệ thống, người sử dụng được cung cấp một phần mềm lập trình được xây dựng trên cơ sở hướng đối tượng với cấu trúc module hóa. Mỗi khối chức năng là một module mềm. Việc cấu hình chip như thế nào tùy thuộc vào người lập trình thông qua một số thư viện chuẩn. Người lập trình thiết lập cấu hình trên chíp chỉ đơn giản bằng cách muốn chip có chức năng gì thì kéo chức năng đó và thả vào khối tài nguyên số hoặc tương tự, hoặc cả hai tùy theo từng chức năng (phương pháp lập trình kéo thả). Việc thiết lập ngắt trên chân nào, loại ngắt gì, các chân vào ra được hoạt động ở chế độ như thế nào đều tùy thuộc vào việc thiết lập của người lập trình khi thiết kế và lập trình cho PSoC. Với khả năng cấu hình mạnh mẽ như vậy, một thiết bị điều khiển, đo lường có thể được gói gọn trong một chip duy nhất. Chính vì lý do đó, hãng Cypress Micro Systems đã không gọi sản phẩm của mình là vi điều khiển như truyền thống, mà goị là “thiết bị PsoC”, và họ hy vọng rằng, với khả năng đặt cấu hình mạnh mẽ, người sử dụng sẽ có những thiết bị điều khiển, những thiết bị đo có giá thành rẻ, kích thước nhỏ gọn, và sản phẩm PsoC của họ sẽ thay thế được những thiết bị dựa trên vi xử lý hoặc vi điều khiển đã có từ trước đến nay. Vi điều khiển CY8C27443 Đặc điểm chính của PSoC CY8C27443: Bộ xử lý với kiến trúc Harvard mạnh mẽ. Tốc độ của bộ xử lý lên đến 24MHz. Lệnh nhân 8 bit x 8 bit, thanh ghi tích lũy là 32 bit. Hoạt động ở tốc độ cao mà tiêu hao ít năng lượng. Dải hoạt động từ 3.0 tới 5.25V. Điện áp hoạt động có thể giảm xuống 1.0V sử dụng chế độ kích điện áp. Hoạt động trong dải nhiệt độ từ -40 đến 85°C Các khối ngoại vi có thể được sử dụng độc lập hoặc kết hợp. 12 khối ngoại vi tương tự có thể được thiết lập để làm các nhiệm vụ: Các bộ ADC 14 bit. Các bộ DAC 9 bit. Các bộ khuếch đại có thể lập trình hệ số khuếch đại. Các bộ lọc và các bộ so sánh có thể lập trình được. 8 khối ngoại vi số có thể được thiết lập để làm các nhiệm vụ: Các bộ định thời đa chức năng, đếm sự kiện, động hồ thời gian thực, bộ điều chế độ rộng xung có và không có dải an toàn (deadband). Các module kiểm tra lỗi (CRC modules). 2 bộ truyền thông nối tiếp không đồng bộ 2 chiều. Các bộ truyền thông SPI Master và Slave có thể cấu hình được. Có thể kết nối với tất cả các chân vào ra. Bộ nhớ linh hoạt trên chip. Không gian bộ nhớ chương trình Flash 16 Kbyte với chu kỳ ghi xóa la 50.000 lần. Không gian bộ nhớ RAM là 256 byte. Chip có thể lập trình thông qua chuẩn nối tiếp (ISSP). Bộ nhớ Flash có thể được nâng cấp từng phần. Một phần bộ nhớ Flash có thể được giả lập như một bộ nhớ EEPROM, cho phép lưu các thông số trong lúc chạy chương trình. Chế độ bảo mật đa năng, tin cậy. Có thể tạo được không gian bộ nhớ Flash trên chip lên tới 2.304 byte. Có thể cấu hình cho các chân khả trình. Các chân vào ra ba trang thái sử dụng Trigger Schmitt. Đầu ra logic có thể cung cấp dòng 25 mA với điện trở treo cao hoặc thấp bên trong. Thay đổi được ngắt trên từng chân. Đường ra tương tự có thể cung cấp dòng tới 40mA. Đường ra đa chức năng có từ 6 đến 44 Xung nhịp của chip có thể lập trình được. Bộ tạo dao động trong 24/48 MHz chính xác 2.5%. Có thể lựa chọn bộ dao động ngoại 24 MHz. Bộ dao động thạch anh nội 32,768 kHz. Bộ tạo dao động tốc độ thấp bên trong sử dụng cho Watchdog và Sleep. Ngoại vi được thiết lập sẵn. Bộ định thời Watchdof và Sleep phục vụ chế độ an toàn và chế độ nghỉ. Module truyền thống I2C™ Slave, Master tốc độ lên tới 400kHz. Module phát hiện điện áp thấp được cấu hình bởi người sử dụng. Công cụ phát triển. Phần mềm phát triển miễn phí (PSoC™ Designer). Bộ lập trình và bộ mô phỏng với đầy đủ tính năng. Kiến trúc của PsoC được chỉ ra trong hình 12, bao gồm 4 thành phần chính: nhân PsoC (PSoC core), hệ thống số, hệ thống tương tự, và các tài nguyên hệ thống. Bus toàn cục có thể cấu hình được cho phép tất cả tài nguyên của thiết bị kết hợp thành một hệ thống hoàn chỉnh cho người sử dụng. Họ PsoC CY8C27x43 có thể có tới 5 cổng vào ra được kết nối với các liên kết số và tương tự toàn cục, cung cấp truy cập tới 8 khối số và 12 khối tương tự. Sơ đồ khối cấu trúc của PSoC CY8C27433 Các khối số Hệ thống số là tập hợp của 8 khối số 8 bit có thể được sử dụng độc lập hoặc kết hợp với các khối khác thành các ngoại vi 8, 16, 24 hay 32bit. Các khối số của PSOC Các khối số được tổ chức dưới dạng các hàng bốn khối với số khối biến đổi theo từng họ thiết bị PSoC. Điều này cho phép bạn lựa chọn các tài nguyên hệ thống cho ứng dụng của mình. Những ngoại vi được tạo bởi khối PSoC số : Bộ điều chế độ rộng xung (8 đến 32 bit). Bộ điều chế độ rộng xung với dải an toàn (8 đến 32 bit). Bộ đếm (8 đến 32 bit). Bộ định thời (8 đến 32 bit). Bộ truyền thông không đồng bộ UART 8 bit với bit chẵn lẻ lựa chọn được. Bộ truyền thông nối tiếp SPI master và slave. Bộ truyền thông I2C slave và master (đã có sẵn như tài nguyên hệ thống). Bộ tạo dãy CRC phục vụ việc kiểm tra lỗi. Bộ truyền và nhận giao tiếp quang học. Các khối PSoC số có thể được kết nối với mọi GPIO thông qua một loạt bus toàn cục đảm bảo cho mọi tín hiệu đến được với tất cả các chân. Những bus này cũng cho phép dồn kênh tín hiệu và điều hành việc thực hiện các phép toán logic. Bộ đếm COUNTER Loại Số khối PSoC Bộ nhớ(Byte) Số chân Số Tương tự CT Tương tự SC Flash RAM 8-bit 1 0 0 71 0 1 16-bit 2 0 0 93 0 1 24-bit 3 0 0 128 0 1 32-bit 4 0 0 146 0 1 Các bộ đếm 8, 16, 24, 32-bit với các đặc điểm sau: Độ rộng thanh ghi 8, 16, 24, 32 bit, sử dụng 1, 2, 3, 4 khối PSoC theo thứ tự. Xung nhịp nguồn lên tới 48 MHz. Tự động nạp lại chu ký khi đếm xong. Khả năng chụp (capture) tới 24 MHz. Đầu ra đếm kết thúc có thể được sử dụng như là đầu vào xung nhịp cho các khối chức năng số và tương tự khác. Lựa chọn chế độ ngắt khi đếm kết thúc, chụp, hoặc là khi bộ đếm đạt một giá trị đặt trước. Sơ đồ khối bộ đếm của PSoC CY8C27433 Các module Counter là những bộ đếm lùi với chu kỳ có thể lập trình được, có khả năng chụp giữ. Xung nhịp và các tín hiệu cho phép có thể được lựa chọn từ nguồn ngoài hoặc từ xung nhịp hệ thống. Sau khi được khởi động, bộ đếm hoạt động liên tục và sẽ tải giá trị bên trong của nó từ thanh ghi chu kỳ sau khi đạt đến giá trị đếm kết thúc. Trong mỗi chu kỳ xung nhịp, bộ đếm sẽ so sánh giá trị đếm hiện thời với giá trị được lưu trữ trong thanh ghi so sánh. Điều kiện so sánh là “nhỏ hơn” hay “nhỏ hơn hoặc bằng” liên tục được kiểm tra trong mỗi chu kỳ xung nhịp. Các ngắt có thể được sinh ra dựa trên tín hiệu đếm kết thúc hoặc điều kiện so sánh. Config các khối UART Loại Số khối PSoC Bộ nhớ(Byte) Số chân Số Tương tự CT Tương tự SC Flash RAM API mức thấp 2 0 0 310 0 2 API mức cao 2 0 0 506 3+Buffer 2 Bộ truyền thông không đồng bộ UART có các đặc điểm sau: Bộ nhận và truyền tín hiệu không đồng bộ. Định dạng dữ liệu tương thích với định dạng dữ liệu RS-232. Tốc độ xung đồng bộ lên tới 6Mbit/s. Khung dữ liệu bao gồm bit Start, bit chẵn lẻ (lựa chọn) và các bit Stop. Ngắt khi thanh ghi nhận đầy (lựa chọn) hoặc khi bộ đệm truyền rỗng. Phát hiện chẵn lẻ, khung quá tải, khung báo lỗi. Các chức năng phát và thu ở mức cao. Module người sử dụng UART là một bộ truyền nhận nối tiếp không đồng bộ hỗ trợ chuẩn kép RS-232, định dạng truyền thông nối tiếp qua hai dây. Người sử dụng có thể lập trình xung nhịp đồng hồ và lựa chọn ngắt phù hợp. Phần mềm nhúng với giao diện chương trình ứng dụng (API) thông thường được cung cấp để khởi tạo, cấu hình và điều khiển UART. Thêm vào đó, một API mức cao cũng được cung cấp để hỗ trợ việc nhận các lệnh cơ sở và in các chuỗi ký tự. Module UART được xây dựng bởi hai module TX và RX cùng với một số thư viện hỗ trợ cho việc truyền thông. Hai module TX va RX có thể được sử dụng riêng. Sơ đồ nguyên lý module UART của PSOC Thiết bị cân Thiết bị cân Mettler Toledo IND130 Mettler Toledo IND130 là một thiết bị cân điện tử thông minh được cung cấp bởi Metter Toledo, một công ty lớn với nhiều năm kinh nghiệm với các sản phẩm trong lĩnh vực đo lường, khá quen thuộc với thị trường Việt Nam. Lắp đặt nhanh chóng và vận hành đơn giản, khả năng kết nối trực tiếp với PLC cũng như PC, cung cấp tín hiệu ổn định, Mettler Toledo IND130 được lựa chọn sử dụng rất rộng rãi trong các dây chuyền công nghiệp cũng như những ứng dụng đòi hỏi sự chính xác, tin cậy cao và khả năng hoạt động liên tục. Các thông số và đặc tính : Kích thước: 102 x 50 x 125 mm. Trọng lượng: 0,34kg. Nguồn nuôi: 24 VDC. Nhiệt độ làm việc: -10˚C đến 45˚C. Độ phân giải tối đa: 10.000 mức. Bộ lọc số: TraxDSP. Giao diện PC/PLC: tuỳ chọn RS-232, PROFIBUS, Allen-Bradley RIO, DeviceNet**. Các cổng vào ra trên Mettler Toledo IND130 Chức năng Không chỉ là một chiếc cân điện tử với độ chính xác cao, Mettler Toledo IND130 được sản xuất với mục đích điều khiển một hệ thống cân đóng bao trong công nghiệp. Nó có các cổng giao tiếp với PC/PLC cùng với một số đường vào ra để điều khiển các quá trình hệ thống. Các cổng này được nối với các van khí nén trong hệ thống, cung cấp tín hiệu điều khiển đóng mở van. Cổng nối tiếp Mettler Toledo IND130 có một cổng nối tiếp 2 chiều RS-232/485 có thể được lập trình cho nhiều chức năng. Việc lựa chọn giữa hai chuẩn này được thực hiện bằng cách thay đổi vị trí chốt (jumper) trên thiết bị. Vị trí chốt của RS-232 và RS-485 Độ dài tối đa của cáp nối là 15m cho RS-232 và 330m cho RS-485. Đầu vào này có thể được sử dụng để cung cấp các lệnh đơn giản từ thiết bị khác hoặc nếu được lập trình trong chế độ MODBUS RTU, có thể nhận dữ liệu từ bên ngoài. Đầu ra có thể được cấu hình để trao đổi thông tin với máy in hoặc máy tính, hoặc cấu hình thành đầu ra liên tục đến màn hình điều khiển hoặc như một giao diện MODBUS RTU cao cấp hơn. Truyền thông Modbus RTU Địa chỉ Bit Dữ liệu chỉ ghi 40101 .0 .1 .2 .3 0001~0100: Nguyên liệu được dùng .4 .5 .6 .7 0001: Bắt đầu đổ nguyên liệu được xác định bởi bit 0~3 .8 Bắt đầu quá trình cân .9 Giữ quá trình cân .10 Kết thúc quá trình cân .11 Xả .12 Đóng bao .13 Đẩy bao ra .14 Trở về mức 0 40102 .0 .1 .2 .3 0001~0011: Chọn chế độ làm việc (1~3) .4 10: chế độ tự động đổ từng nguyên liệu 11: tiếp tục chế độ đổ tự động .5 .6 10: chế độ xả thủ công 11: chế độ xả tự động .7 40103 Kiểm tra đĩa cân: 0:lưu trọng lượng điểm 0 xxxx: lưu trọng lượng tải (xxxx là trọng lượng kiểm tra) Địa chỉ Bit Dữ liệu chỉ đọc 40001 Tổng trọng lượng 40002 Trọng lượng thực 40003 .0 Nguyên liệu 1 đang trong quá trình tinh .1 Nguyên liệu 1 đang trong quá trình thô .4 Nguyên liệu 2 đang trong quá trình tinh .5 Nguyên liệu 2 đang trong quá trình thô .8 Nguyên liệu 3 đang trong quá trình tinh .9 Nguyên liệu 3 đang trong quá trình thô .12 Nguyên liệu 4 đang trong quá trình tinh .13 Nguyên liệu 4 đang trong quá trình thô 40004 .0 0001~0011: Chế độ hiện tại (1~3) .1 .2 .3 .4 Cân đang hoạt động .5 Cân đang giữ .6 Đang xả .7 Tất cả nguyên liệu đã đổ, đang chờ xả .8 Kích thước tải trọng: 0000=0.001 0001=0.002 0010=0.005 0011=0.01 0100=0.02 0101=0.05 0110=0.1 0111=0.2 1000=0.5 1001=1 1010=2 1011=5 1100=10 .9 .10 .11 .12 Nguyên liệu được đổ đã quá dung sai cho phép .13 Bàn cân đang hoạt động .14 Chế độ đổ nguyên liệu .15 Chế độ xả 40005 Kết quả đổ nguyên liệu 1 40006 Kết quả đổ nguyên liệu 2 40007 Kết quả đổ nguyên liệu 3 40008 Kết quả đổ nguyên liệu 4 Địa chỉ Dữ liệu có thể đọc và ghi 40009 Bao bì 40010 Lượng đặt cho nguyên liệu 1 40011 Lượng đặt cho nguyên liệu 2 40012 Lượng đặt cho nguyên liệu 3 40013 Lượng đặt cho nguyên liệu 4 40014 Lượng thô của nguyên liệu 1 40015 Lượng thô của nguyên liệu 2 40016 Lượng thô của nguyên liệu 3 40017 Lượng thô của nguyên liệu 4 40018 Lượng dư của nguyên liệu 1 40019 Lượng dư của nguyên liệu 2 40020 Lượng dư của nguyên liệu 3 40021 Lượng dư của nguyên liệu 4 40022 Khoảng trọng lượng 0 (zero range) 40023 Chu kỳ tự động sửa lượng dư 40024 Bắt đầu thời gian trễ 40025 Thời gian cấm 40026 Thời gian trễ đóng van xả 40027 Thời gian trễ để giải quyết sai số cho vật liệu 1 40028 Thời gian trễ để giải quyết sai số cho vật liệu 2 40029 Thời gian trễ để giải quyết sai số cho vật liệu 3 40030 Thời gian trễ để giải quyết sai số cho vật liệu 4  Thiết kế hệ thống Cấu trúc hệ thống Sơ đồ khối hệ thống Hệ thống cân đóng bao được thiết kế với 3 thành phần chính: khối giao diện người – máy, khối điều khiển và bộ cân. Ngoài ra, hệ thống còn có khả năng kết nối với máy tính. LCD Keyboard Modbus Modbus CAN/RS232-485 Sơ đồ khối hệ thống cân đóng bao Khối giao tiếp người – máy Khối giao tiếp người máy (HMI) là một phần không thể thiếu trong các hệ thống tự động hóa với chức năng chính là cầu nối giữa hệ thống và người điều khiển. Thực chất, HMI là một bản mạch với thành phần chính là một màn hình LCD với nhiệm vụ hiển thị thông tin về hệ thống, và một bàn phím để người sử dụng bật/tắt hệ thống, nhập dữ liệu, cũng như lựa chọn các chế độ hoạt động cho hệ thống. HMI được thiết kế với một thiết bị PSoC riêng với mục đích điều khiển màn hình, bàn phím và giao tiếp với các khối khác qua module UART của mình.  Khối giao tiếp người-máy Khối điều khiển Nếu như khối giao diện người – máy được coi như bộ mặt của hệ thống, nơi có các ‘giác quan’ để giao tiếp với con người thì khối điều khiển có thể được xem là bộ não, nơi điều khiển toàn bộ hành vi của hệ thống. ‘Linh hồn’ của khối điều khiển chính là vi điều khiển dsPIC 30F6010. Tại đây, tín hiệu từ HMI cũng như khối cân gửi về qua module UART được xử lý, đồng thời các tín hiệu điều khiển cũng được phát đi theo đúng lưu đồ thuật toán đã phân tích ở trên. Khối điều khiển cũng được thiết kế với một chip điều khiển truyền thông CAN MCP2515. Đây là một thiết bị được cung cấp bởi MicroChip với đầy đủ thanh ghi, bộ đệm, đồng hồ xung nhịp, khối điều khiển logic... như một chip điều khiển chuyên dụng có khả năng hoạt động độc lập để phục vụ truyền thông CAN. Việc tích hợp thiết bị này nhằm hướng đến việc trao đổi dữ liệu với máy tính trong cấu hình chung gồm nhiều hệ thống tự động được quản lý bởi một máy chủ của nhà máy. Trong khuôn khổ luận văn này, MCP2515 tạm thời chưa được sử dụng đến.  Khối điều khiển Khối cân Như đã trình bày ở chương 3, hệ thống cân đóng bao sử dụng thiết bị cân Mettler Toledo IND130. Đây là thiết bị cân có sẵn trên thị trường, được chế tạo nhằm phục vụ cho các bài toán cân mẻ nói chung và cân đóng bao nói riêng. Thiết bị này có một cổng nối tiếp theo chuẩn RS-232/RS485 được sử dụng để truyền dữ liệu cân về khối điều khiển. Truyền thông trong hệ thống Hệ thống sử dụng hai giao thức truyền dữ liệu là Modbus và CAN. Với ưu điểm là tính đơn giản, Modbus được lựa chọn để thực hiện việc truyền dữ liệu giữa khối điều khiển với khối HMI và khối cân. Hơn nữa, Modbus được hỗ trợ bởi đường truyền nối tiếp RS-232 hoặc RS-485 được tích hợp trong cả vi điều khiển dsPIC, PSoC, cũng như trong khối cân Mettler Toledo IND130. Modbus được sử dụng trong việc truyền thông giữa HMI và khối điều khiển. Giao thức CAN tỏ ra vượt trội trong việc kết nối hệ thống cân đóng bao với các hệ thống khác cũng như với máy chủ điều khiển toàn bộ các quá trình trong cả nhà máy. Với cơ chế giao tiếp theo phương pháp định địa chỉ và giao tiếp hướng đối tượng của mình, CAN mang lại hiệu quả cao khi đặt trong truyền thông với phạm vi toàn cục. Phần mềm giám sát hệ thống Phần mềm giám sát hệ thống là phần mềm chạy trên máy tính, hệ điều hành WinXP. Thông qua bộ chuyển đổi USB-RS485, với trình điều khiển thiết bị cho phép người lập trình giao tiếp với mạng RS485 thông qua cổng USB của máy tính bằng một cổng COM ảo. Phầm mềm giao tiếp với hệ thống theo chuẩn truyền thông Modbus, hỗ trợ các hàm 03, 06, 16. Các tính năng chính của phần mềm giám sát : Hiển thị và cho phép người sử dụng thay đổi các thông số của hệ điều khiển như lượng đặt, lượng cắt thô, tinh… Giám sát quá trình cân đóng bao theo thời gian thực Đếm số bao đã được đóng gói, số bao bị lỗi (thừa/thiếu cân), in và lưu vào cơ sở dữ liệu.  Triển khai phần cứng và các kết quả đạt được Giao diện người – máy Sơ đồ nguyên lý  Sơ đồ nguyên lý khối giao tiếp người-máy Phương thức hoạt động Khối giao tiếp người – máy cho phép người sử dụng cài đặt cấu hình cho hệ thống điều khiển, chỉnh sửa các giá trị đặt trước, kiểm tra trạng thái các đầu vào, ra. Giao tiếp giữa khối HMI và khối điều khiển là Modbus. Bộ điều khiển Sơ đồ  Sơ đồ nguyên lý khối điều khiển Phương thức hoạt động Trong quá trình triển khai thực tế, hệ thống cơ khí đang có là hệ thống đóng bao bằng tay, với một người công nhân sẽ nhìn số cân để đóng van. Việc nâng cấp hệ thống này bằng việc đưa vào hệ thống điều khiển tự động yêu cầu phải thực hiện trong thời gian rất ngắn. Việc nâng cấp hệ thống cơ khí cho 2 van xả với tốc độ dòng liệu lớn và nhỏ đòi hỏi chi phí lớn, thời gian dài. Do đó, giải pháp cho vấn đề là sử dụng cửa xả liệu hiện tại, đóng mở cửa xả này bằng xilanh khí nén với van 2 ngả. Cùng với một sensor báo hành trình pittong khí nén, bộ điều khiển có thể dừng xilanh khí nén tại điểm có sensor, tương đương với mở van một góc nhỏ, dòng liệu chảy qua van nhỏ. Bộ điều khiển liên tục nhận dữ liệu cân từ thiết bị đọc đầu cân IND130 gửi về. Thuật toán điều khiển chỉ phải chỉnh sửa khi hệ thống chuyển trạng thái từ xả thô sang xả tinh. Khi đó, bộ điều khiển ra lệnh đóng van cho đến khi gặp tín hiệu báo pittong đã chạy đến điểm đặt thì ngắt tín hiệu đóng van. Xilanh sẽ dừng tại điểm đặt, tương đương với van xả mở nhỏ. Khi bao đầy, bộ điều khiển ra lệnh đóng van bình thường. Triển khai ứng dụng hệ thống tại nhà máy Phân lân Ninh Bình Một số hình ảnh của các thiết bị đã chế tạo được trong hệ thống Ảnh tủ điều khiển Ảnh mạch nguồn Ảnh khối giao tiếp người máy Ảnh tủ van khí nén Ảnh khối cân Mettler Toledo IND130  Kết luận Tóm lại, luận văn đã xây dựng thành công một hệ thống cân đóng bao hoàn chỉnh, có khả năng vận hành trong thực tế. Hệ thống có giao diện thân thiện, khả năng xử lý thông minh, làm cho giai đoạn đóng gói sản phẩm trở nên nhanh chóng, chính xác, đồng thời có khả năng kết nối, đồng bộ cao trong cấu hình chung của cả một nhà máy. Một hệ thống hoàn toàn tự động như vậy không chỉ mang lại hiệu quả cao về thời gian và tiền bạc, mà còn giúp giảm bớt nhân công, đóng góp vào việc nâng cao hiệu suất lao động. Trong tương lai, hệ thống có thể được phát triển thêm bằng cách tập trung nâng cấp bộ truyền thông CAN để ghép nối được với máy chủ cũng như các hệ thống tự động khác. Khi đó chỉ cần ngồi ở một máy chủ để điều khiển toàn bộ các quá trình đang vận hành trong nhà máy. Cùng với việc xây dựng các hệ thống tương tự, tin rằng trong tương lai không xa, các dây chuyền sản xuất công nghiệp ở nước ta sẽ hoàn toàn được tự động hóa, đưa Việt Nam trở thành một nước công nghiệp hiện đại, sánh vai với các nước trong khu vực cũng như trên toàn thế giới. Phụ lục Mã nguồn các loại Chương trình chính, đọc dữ liệu, xử lý thuật toán #include // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules #include "const.h" // PSoC API definitions for all User Modules #include "modbusmachine.h" //khai bao cac gia tri #define THIS_DEVICE_ADDRESS 181 #define ACK 0x06 #define STATE_IDLE 0x00 #define STATE_VAOBAO 0x01 #define STATE_COARSE_FEED 0x02 #define STATE_FINE_FEED 0x03 #define STATE_MOVE_FINE_PITT 0x04 #define STATE_RABAO 0x05 #define MODE_MAN 0x00 #define MODE_AUTO 0x01 #define OUT_CLOSE_VAL 0b10000000 #define OUT_OPEN_VAL 0b01000000 #define OUT_KEP_BAO 0b00100000 #define OUT_DAY_BAO 0b00010000 #define OUT_TOL 0b00001000 #define OUT_ERR 0b00000001 #define OUT_TO_IN0 0b00000010 #define IN_COARSE in0 & 0b10000000 #define IN_FINE in0 & 0b01000000 #define IN_DISCH in0 & 0b00100000 #define IN_TOL in0 & 0b00010000 #define IN_VAOBAO in1 & 0b00100000 #define IN_HT_PITT in1 & 0b00010000 #define IN_MODE in0 & 0b00001000 #define IN_M_CLOSE in0 & 0b00000010 #define IN_M_OPEN in0 & 0b00000100 #define IN_M_OUT in0 & 0b00000001 #define OUT_CLOSE_VAL 0b10000000 #define OUT_OPEN_VAL 0b01000000 #define OUT_KEP_BAO 0b00100000 #define OUT_DAY_BAO 0b00010000 #define OUT_TOL 0b00001000 #define OUT_ERR 0b00000001 #define OUT_TO_IN0 0b00000010 char heartbeat = 0; char x = 0; char timeout = 0; char j = 0; char i = 0; char in0 = 0; char in1 = 0; char out0 = 0; unsigned int iTime = 0; unsigned int iDelay = 0; char nState = STATE_IDLE; char nMode = MODE_MAN; char CheckTimeOut() { if(!iTime) { return 1; } else { iTime--; return 0; } } void delayms(int ndelay) { heartbeat = 0; while(ndelay) { while(!heartbeat); heartbeat = 0; while(!heartbeat); heartbeat = 0; ndelay--; } } void main() { int k; M8C_EnableGInt ; // Turn on interrupts SerMB_1_TxIntMode(SerMB_1_INT_MODE_TX_COMPLETE); SerMB_1_EnableInt(); SerMB_1_Start(UART_PARITY_NONE); // Enable UART TimeMB_1_EnableInt(); TimeMB_1_WritePeriod(250); Counter8_1_Start(); Counter8_2_EnableInt(); // Counter8_2_WritePeriod(40); PRT0DR = 0b00000000; PRT1DR = 0b00000000; PRT2DR = 0b00000000; //out out0 = 0b00; nState = STATE_IDLE; Counter8_2_Start(); TESTLOOP: if(!heartbeat) goto TESTLOOP; heartbeat = 0; in1 = PRT1DR & 0b11110000; in0 = PRT0DR & 0b11111111; PRT2DR = out0; // if(in0 & 0b00000001) //ct hanh trinh pittong if(nState == STATE_IDLE) { PRT1DR &= 0b11110011; if(in1 & IN_VAOBAO) { out0 = OUT_KEP_BAO | OUT_TO_IN0; iDelay = 1000; iTime = 20000; //dat 10s cho vao bao nState = STATE_VAOBAO; goto TESTLOOP; } out0 = 0x00; } if(nState == STATE_MOVE_FINE_PITT) { // PRT1DR &= 0b11110011; // PRT1DR |= 0b00001100; if(IN_FINE) //co fine { out0 = OUT_CLOSE_VAL|OUT_KEP_BAO; if(IN_HT_PITT) //pit den ct hanh trinh { nState = STATE_FINE_FEED; iTime = 30000; //dat 15s cho fine feed // out0 = OUT_CLOSE_VAL|OUT_OPEN_VAL|OUT_KEP_BAO; out0 = OUT_KEP_BAO; goto TESTLOOP; } } else //chay 1 toc do { out0 = OUT_CLOSE_VAL|OUT_KEP_BAO; iTime = 3000; //dat 2.5s cho ra bao iDelay = 2000; //doi mo kep bao nState = STATE_RABAO; goto TESTLOOP; } if(CheckTimeOut()) { nState = STATE_IDLE; out0 = 0x00; } } if(nState == STATE_VAOBAO) { if(iDelay) { out0 = OUT_KEP_BAO | OUT_TO_IN0; if(IN_COARSE) //coarse tat { out0 |= OUT_OPEN_VAL; } iDelay--; goto TESTLOOP; } out0 = OUT_KEP_BAO ; if(IN_COARSE) { nState = STATE_COARSE_FEED; iTime = 60000; //dat 30s cho coarse feed goto TESTLOOP; } if(CheckTimeOut()) { nState = STATE_IDLE; out0 = 0x00; goto TESTLOOP; } } if(nState == STATE_COARSE_FEED) { if(IN_COARSE) //coarse tat { out0 = OUT_OPEN_VAL|OUT_KEP_BAO; } else { out0 = OUT_CLOSE_VAL|OUT_KEP_BAO; iTime = 20000; //dat 0.5s cho move fine iDelay = 4000; //doi mo kep bao nState = STATE_MOVE_FINE_PITT; goto TESTLOOP; } if(CheckTimeOut()) { nState = STATE_IDLE; out0 = 0x00; } } if(nState == STATE_FINE_FEED) { // PRT1DR &= 0b11110011; // PRT1DR |= 0b00000100; if(IN_FINE) //coarse tat { // out0 = OUT_CLOSE_VAL|OUT_OPEN_VAL|OUT_KEP_BAO; out0 = OUT_KEP_BAO; } else { out0 = 0; iDelay = 2000; //doi mo kep bao iTime = 3000; //dat 2.5s cho ra bao nState = STATE_RABAO; goto TESTLOOP; } if(CheckTimeOut()) { nState = STATE_IDLE; out0 = 0x00; } } if(nState == STATE_RABAO) { if(iDelay) { out0 = OUT_CLOSE_VAL; //doi mo kep bao va dong van iDelay--; } else { out0 = OUT_DAY_BAO; //doi mo kep bao va dong van if(CheckTimeOut()) { nState = STATE_IDLE; out0 = 0x00; } } } heartbeat = 0; goto TESTLOOP; MAINLOOP: goto MAINLOOP; } #pragma interrupt_handler COUNTER8_2_ISR_C void COUNTER8_2_ISR_C() { heartbeat = 1; } Chương trình đọc phím, hiển thị LCD //---------------------------------------------------------------------------- // C main line //---------------------------------------------------------------------------- #include // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules #include "modbusmachine.h" #define THIS_DEVICE_ADDRESS 181 #define ACK 0x06 #define KEY_IDLE 0x00 #define KEY_DOWN 0x01 #define KEY_UP 0x02 #define KEY_HOLD 0x03 #define KEY_WAIT 0x04 #define KF_CANCEL 0x01 #define KF_SET_RECIPE 0x02 #define KF_SET_FINE 0x03 #define KF_ENTER 0x04 #define LCD_DATA_POINT0 9 #define STATE_IDLE 0x00 #define STATE_SET_RECIPE 0x01 #define STATE_SET_FINE 0x02 #define STATE_CANCEL 0x04 #define STATE_SEND_RECIPE 0x05 #define STATE_SEND_FINE 0x06 #define STATE_PARAM_ERR 0x03 #define STATE_COMM_ERR 0x0f char nState = STATE_IDLE; char LCDport = 0; char LCDCurRow = 0; char LCDCurPos = 0; char heartbeat = 0; char x = 0; char j = 0; char i = 0; char nKeyScan = 0; char nBeep = 0; char nSpeakerState = 0; int iTime = 0; char nKeyPress = 0; char* pTempChar = 0; char tmp = 0; char nRecipe1 = 0; char nRecipe2 = 0; char nRecipe3 = 0; char nRecipe4 = 0; char nFine1 = 0; char nFine2 = 0; char nFine3 = 0; char nFine4 = 0; char nTempRecipe1 = 0; char nTempRecipe2 = 0; char nTempRecipe3 = 0; char nTempRecipe4 = 0; char nTempFine1 = 0; char nTempFine2 = 0; char nTempFine3 = 0; char nTempFine4 = 0; void SendBuffWithCRC() { mb_crc(pInBuff,nInBuffCount); SerMB_1_Start(UART_PARITY_NONE); // Enable UART bat dau nhan lenh MODBUS for(i=0;i<nInBuffCount;i++) { PRT0DR |= 0b00001000; //Enable Transmitter SerMB_1_SendData(pInBuff[i]); while(PRT0DR & 0b00001000) ; } pTempChar = (char*)(&crc); PRT0DR |= 0b00001000; //Enable Transmitter SerMB_1_SendData(pTempChar[0]); while(PRT0DR & 0b00001000) ; PRT0DR |= 0b00001000; //Enable Transmitter SerMB_1_SendData(pTempChar[1]); while(PRT0DR & 0b00001000) ; } char nKeyState = KEY_IDLE; char nKeyRow = 1; char nKeyCol = 1; char nKeyOldRow = 0; char nKeyOldCol = 0; char nKeyHoldTime = 0; char GetKeyFunc() { switch(nKeyOldRow) { case 6: //fim cancel return KF_CANCEL; case 5: //fim F1 return KF_SET_RECIPE; case 4: //fim F2 return KF_SET_FINE; case 3: //fim F3 = Enter return KF_ENTER; } return KF_CANCEL; } char GetKeyNum() { switch(nKeyOldRow) { case 6: //fim cancel switch(nKeyOldCol) { case 0b11111011: return 7; case 0b11111101: return 8; case 0b11111110: return 9; } break; case 5: //fim F1 switch(nKeyOldCol) { case 0b11111011: return 4; case 0b11111101: return 5; case 0b11111110: return 6; } break; case 4: //fim F2 switch(nKeyOldCol) { case 0b11111011: return 1; case 0b11111101: return 2; case 0b11111110: return 3; } break; case 3: //fim F3 = Enter switch(nKeyOldCol) { case 0b11111011: return 0; case 0b11111101: return '.'; case 0b11111110: return '+'; } break; } return KF_CANCEL; } char KeyScan() { PRT2DR |= 0b00111111; switch(nKeyRow) { case 1: //chua dung // PRT2DR &= 0b11111110; break; case 2: //chan ban phim loi // PRT2DR &= 0b11111101; break; case 3: PRT2DR &= 0b11111011; break; case 4: PRT2DR &= 0b11110111; break; case 5: PRT2DR &= 0b11101111; break; case 6: PRT2DR &= 0b11011111; break; } PRT0DR |= 0b01001111; //chot PRT0DR &= 0b10111111; // if(nKeyState == KEY_IDLE) { PRT0DR |= 0b00001111; nKeyCol = PRT0DR | 0b11110000; if(nKeyCol != 0b11111111) //phim duoc bam { nKeyOldCol = nKeyCol; nKeyOldRow = nKeyRow; nKeyHoldTime = 1; nKeyState = KEY_DOWN; return 0; } nKeyRow++; if(nKeyRow==7) { nKeyRow = 1; } } if(nKeyState == KEY_DOWN) { PRT0DR |= 0b00001111; nKeyCol = PRT0DR | 0b11110000; if(nKeyCol == 0b11111111) //phim duoc tha { if(nKeyHoldTime > 3) { nKeyRow = 1; nKeyHoldTime = 1; nKeyState = KEY_UP; nBeep = 5; return KEY_UP; } else { nKeyRow = 1; nKeyHoldTime = 1; nKeyState = KEY_IDLE; return 0; } } else { if((nKeyCol & nKeyOldCol) == nKeyOldCol) { nKeyHoldTime++; if(nKeyHoldTime>250) //giu 3s { nKeyHoldTime = 250; nKeyState = KEY_HOLD; nBeep = 50; return KEY_HOLD; } } else //phim da duoc tha, 1 phim khac dang bi giu { nKeyRow = 1; nKeyState = KEY_WAIT; return 0; } } } if(nKeyState == KEY_UP) { nKeyRow = 1; nKeyState = KEY_WAIT; } if(nKeyState == KEY_HOLD) { nKeyRow = 1; nKeyState = KEY_WAIT; } if(nKeyState == KEY_WAIT) { PRT0DR |= 0b00001111; nKeyCol = PRT0DR | 0b11110000; if(nKeyCol != 0b11111111) //row co phim duoc bam { return 0; } nKeyRow++; if(nKeyRow==7) { nKeyRow = 1; nKeyHoldTime ++; if(nKeyHoldTime > 3) { nKeyHoldTime = 0; nKeyState = KEY_IDLE; } } } return 0; } void LCD_UpdateData() { PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD // LCD_1_Position(0, 12); LCD_1_Control(LCD_1_CURSOR_OFF); LCD_1_Position(0, LCD_DATA_POINT0); LCD_1_WriteData(nTempRecipe1 + 48); LCD_1_WriteData(nTempRecipe2 + 48); LCD_1_WriteData('.'); LCD_1_WriteData(nTempRecipe3 + 48); LCD_1_WriteData(nTempRecipe4 + 48); LCD_1_Position(1, LCD_DATA_POINT0); LCD_1_WriteData(nTempFine1 + 48); LCD_1_WriteData(nTempFine2 + 48); LCD_1_WriteData('.'); LCD_1_WriteData(nTempFine3 + 48); LCD_1_WriteData(nTempFine4 + 48); LCDport = PRT2DR; PRT0DR &= 0b01111111; // } char CheckTimeOut() { if(!iTime) { return 1; } else { iTime--; return 0; } } void main() { int k; M8C_EnableGInt ; // Turn on interrupts // SerMB_1_TxIntMode(SerMB_1_INT_MODE_TX_COMPLETE); // SerMB_1_EnableInt(); // SerMB_1_Start(UART_PARITY_NONE); // Enable UART TimeMB_1_EnableInt(); TimeMB_1_WritePeriod(250); // Counter8_1_Start(); Counter8_2_EnableInt(); // Counter8_2_WritePeriod(40); UART_2_TxIntMode(UART_2_INT_MODE_TX_COMPLETE); UART_2_EnableInt(); PRT0DR = 0b00111111; PRT1DR = 0b11110011; PRT2DR = 0b11111111; //mo phanh PRT0DR |= 0b10000000; //chot LCD LCD_1_Init(); //LCD_1_PrString(char * sRamString); LCD_1_Position(0, 3); LCD_1_PrCString("AU LAC Co"); Counter8_2_Start(); SpeakerPWM8_1_CONTROL_REG = SpeakerPWM8_1_CONTROL_REG_START_BIT; for(i = 0;i<15;i++) { while(!heartbeat); heartbeat = 0; } SpeakerPWM8_1_CONTROL_REG = 0; LCD_1_Position(0, 0); LCD_1_PrCString("Dat : kg"); LCD_1_Position(1, 0); LCD_1_PrCString("Cat tinh: kg"); LCDport = PRT2DR; LCD_UpdateData(); TESTLOOP: if(!heartbeat) goto TESTLOOP; if(nState == STATE_IDLE ) { tmp = KeyScan(); if(tmp==KEY_UP ) { iTime = 1000; if(nKeyOldCol == 0b11110111) //fim chuc nang { tmp = GetKeyFunc(); if(tmp==KF_SET_RECIPE) { nState = STATE_SET_RECIPE; PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(0, LCD_DATA_POINT0); // LCD_1_Control(LCD_1_CURSOR_ON); LCD_1_Control(LCD_1_CURSOR_WINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; LCDCurPos = 0; } if(tmp==KF_SET_FINE) { nState = STATE_SET_FINE; PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(1, LCD_DATA_POINT0); LCD_1_Control(LCD_1_CURSOR_BLINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; LCDCurPos = 0; } } } } if(nState == STATE_SET_RECIPE) { tmp = KeyScan(); if(tmp==KEY_UP ) { if(nKeyOldCol == 0b11110111) //fim chuc nang { tmp = GetKeyFunc(); if(tmp==KF_SET_FINE) { nTempRecipe1 = nRecipe1; nTempRecipe2 = nRecipe2; nTempRecipe3 = nRecipe3; nTempRecipe4 = nRecipe4; LCD_UpdateData(); PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(1, LCD_DATA_POINT0); LCD_1_Control(LCD_1_CURSOR_BLINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; nState = STATE_SET_FINE; goto TESTLOOP; } if(tmp==KF_CANCEL) { nState = STATE_CANCEL; } if(tmp==KF_ENTER) { nRecipe1 = nTempRecipe1; nRecipe2 = nTempRecipe2; nRecipe3 = nTempRecipe3; nRecipe4 = nTempRecipe4; nState = STATE_SEND_RECIPE; } goto TESTLOOP; } else //fim so { tmp = GetKeyNum(); if(tmp!='.' && tmp!='+') { switch(LCDCurPos) { case 0 : nTempRecipe1 = tmp; LCD_UpdateData(); PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(0,LCD_DATA_POINT0+1); LCD_1_Control(LCD_1_CURSOR_WINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; break; case 1 : nTempRecipe2 = tmp; LCD_UpdateData(); PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(0,LCD_DATA_POINT0+3); LCD_1_Control(LCD_1_CURSOR_WINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; break; case 2 : nTempRecipe3 = tmp; LCD_UpdateData(); PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(0,LCD_DATA_POINT0+4); LCD_1_Control(LCD_1_CURSOR_WINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; break; case 3 : nTempRecipe4 = tmp; LCD_UpdateData(); PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(0,LCD_DATA_POINT0); LCD_1_Control(LCD_1_CURSOR_WINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; break; } LCDCurPos++; if(LCDCurPos>3) LCDCurPos = 0; } } iTime = 1000; } if(CheckTimeOut()) { LCDCurPos = 0; nState = STATE_CANCEL; } } if(nState == STATE_SET_FINE) { LCD_UpdateData(); nState = STATE_IDLE; } if(nState == STATE_SEND_RECIPE) { LCD_UpdateData(); nState = STATE_IDLE; } if(nState == STATE_SEND_FINE) { LCD_UpdateData(); nState = STATE_IDLE; } if(nState == STATE_PARAM_ERR) { LCD_UpdateData(); nState = STATE_IDLE; } if(nState == STATE_COMM_ERR) { } if(nState == STATE_CANCEL) { nTempRecipe1 = nRecipe1; nTempRecipe2 = nRecipe2; nTempRecipe3 = nRecipe3; nTempRecipe4 = nRecipe4; nTempFine1 = nFine1; nTempFine2 = nFine2; nTempFine3 = nFine3; nTempFine4 = nFine4; LCD_UpdateData(); nState = STATE_IDLE; } if(tmp==KEY_UP ) { if(nKeyOldCol == 0b11110111) //fim chuc nang { switch(nKeyOldRow) { case 6: //fim cancel // if(LCDCurRow == 0) iTempRecipeH = iRecipeH; iTempRecipeL = iRecipeL; iTempFineH = iFineH; iTempFineL = iFineL; LCD_UpdateData(); break; case 5: //fim F1 PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(0, 11); LCD_1_Control(LCD_1_CURSOR_BLINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; // LCDCurRow = 0; break; case 4: //fim F2 PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(1, 11); LCD_1_Control(LCD_1_CURSOR_BLINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; // LCDCurRow = 1; break; case 3: //fim F3 = Enter iRecipeH = iTempRecipeH; iRecipeL = iTempRecipeL; iFineH = iTempFineH; iFineL = iTempFineL; LCD_UpdateData(); break; } } if(nKeyOldCol == 0b11111011) //fim 7,4,1,0 { switch(nKeyOldRow) { case 6: //fim 7 PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD // LCD_1_Position(0, 11); iRecipeH/10 + 48); if(LCDCurRow == 0) { iTempRecipeH = iRecipeH; iTempRecipeL = iRecipeL; LCD_UpdateData(); } if(LCDCurRow == 1) { iTempFineH = iFineH; iTempFineL = iFineL; LCD_UpdateData(); } LCD_1_WriteData(iRecipeH/10 + 48); LCD_1_WriteData(iRecipeH%10 + 48); LCD_1_WriteData('.'); LCD_1_WriteData(iRecipeL/10 + 48); LCD_1_WriteData(iRecipeL%10 + 48); LCD_1_Position(1, 11); LCD_1_WriteData(iFineH/10 + 48); LCD_1_WriteData(iFineH%10 + 48); LCD_1_WriteData('.'); LCD_1_WriteData(iFineL/10 + 48); LCD_1_WriteData(iFineL%10 + 48); LCDport = PRT2DR; PRT0DR &= 0b01111111; // break; case 5: //fim F1 PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(0, 11); LCD_1_Control(LCD_1_CURSOR_BLINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; // break; case 4: //fim F2 PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD LCD_1_Position(1, 11); LCD_1_Control(LCD_1_CURSOR_BLINK); LCDport = PRT2DR; PRT0DR &= 0b01111111; // break; case 3: //fim F1 PRT2DR = LCDport; PRT0DR |= 0b10000000; //chot LCD // LCD_1_Position(0, 12); LCD_1_Control(LCD_1_CURSOR_OFF); LCDport = PRT2DR; PRT0DR &= 0b01111111; // break; } } iTime = 250; //5 s 0 bam nut nBeep = 5; } if(nBeep) { nBeep--; SpeakerPWM8_1_CONTROL_REG = SpeakerPWM8_1_CONTROL_REG_START_BIT; PRT2DR &= 0b00111111; //bat den led PRT0DR |= 0b01000000; //chot PRT0DR &= 0b10111111; // } else { SpeakerPWM8_1_CONTROL_REG = 0; PRT2DR |= 0b11000000; //tat led PRT0DR |= 0b01000000; //chot PRT0DR &= 0b10111111; // } heartbeat = 0; goto TESTLOOP; /* MAINLOOP: if(nState == STATE_CMD_ENDFR) { SerMB_1_Stop(); //Check crc mb_crc(pInBuff, nInBuffCount-2);//du lieu khong co CRC if(pInBuff[0] == 0)//neu byte dau tien bang 0 { switch (pInBuff[1]) //check Funtion { case 71: //dong bo chuyen dong nState = STATE_MOTION_SYNC; goto MAINLOOP; case 72: //reset nState = STATE_RESET; goto MAINLOOP; default: nState = STATE_IDLE; nInBuffCount = 0; SerMB_1_Start(UART_PARITY_NONE); // goto MAINLOOP; } } if(pInBuff[0] == THIS_DEVICE_ADDRESS)//neu byte dau tien bang dia chi cua thiet bi 181 { switch (pInBuff[1]) //check Funtion { case 71: //dong bo chuyen dong nState = STATE_MOTION_SYNC; goto MAINLOOP; case 72: //reset nState = STATE_RESET; goto MAINLOOP; case 3: nState = STATE_READ;//doc goto MAINLOOP; case 6: nState = STATE_WRITE;//ghi goto MAINLOOP; case 16: nState = STATE_MUL_WRITE;// goto MAINLOOP; default: pInBuff[2] = E_CODE_ILLEGAL_FUNC; nState = STATE_SLAVE_ERR; goto MAINLOOP; } } else { nInBuffCount = 0; nState = STATE_IDLE; SerMB_1_Start(UART_PARITY_NONE); // } } if(nState == STATE_RESET) { nInBuffCount = 0; nState = STATE_IDLE; SerMB_1_Start(UART_PARITY_NONE); // } if(nState == STATE_MOTION_SYNC)//neu trang thai bang trang thai dong bo chuyen dong { nInBuffCount = 0; nState = STATE_IDLE; SerMB_1_Start(UART_PARITY_NONE); // } if(nState == STATE_READ)//neu la trang thai doc { switch (pInBuff[3]) //check Dia chi can doc { case REG_MODE: //Doi mode nState == STATE_READ if(pInBuff[5]==1) //check so luong thanh ghi can doc { goto MAINLOOP; } else //doc nhieu qua, o ho tro { pInBuff[2] = E_CODE_ILLEGAL_DATA_VAL; nState = STATE_SLAVE_ERR; } goto MAINLOOP; // case REG_STATUS: //reset // goto MAINLOOP; case REG_CUR_POS: //nState == STATE_READ if(pInBuff[5]==2) //check so luong thanh ghi can doc { } else //doc nhieu qua, o ho tro { pInBuff[2] = E_CODE_ILLEGAL_DATA_VAL; nState = STATE_SLAVE_ERR; } goto MAINLOOP; case REG_IM_SPEED: //nState == STATE_READ if(pInBuff[5]==1) //check so luong thanh ghi can doc { } else //doc nhieu qua, o ho tro { pInBuff[2] = E_CODE_ILLEGAL_DATA_VAL; nState = STATE_SLAVE_ERR; } goto MAINLOOP; case REG_SYNC_SPEED: //nState == STATE_READ nState = STATE_IDLE; SerMB_1_Start(UART_PARITY_NONE); // goto MAINLOOP; default: //nState == STATE_READ pInBuff[2] = E_CODE_ILLEGAL_DATA_ADDR; nState = STATE_SLAVE_ERR; goto MAINLOOP; } } goto MAINLOOP; */ } #pragma interrupt_handler UART_2_RX_ISR_C void UART_2_RX_ISR_C() { UART_2_bReadRxData(); UART_2_bReadRxStatus(); } #pragma interrupt_handler UART_2_TX_ISR_C void UART_2_TX_ISR_C() { UART_2_bReadTxStatus(); } #pragma interrupt_handler COUNTER8_2_ISR_C void COUNTER8_2_ISR_C() { heartbeat = 1; } Tài liệu tham khảo Tiếng Việt [1] Hoàng Minh Sơn. Mạng truyền thông công nghiệp. NXB KH & KT, 2006, tr.161-170, 182-189. [2] Nguyễn Xuân Sơn. Tài liệu về PSoC. Luận văn tốt nghiệp, tr.1-3. Tiếng Anh [3] dsPIC30F6010A/6015 datasheet, Microchip, 2007, tr.3,4, 65-77, 117-131. [4] IND130 Technical Manual, Mettler Toledo, 2002, tr.61-68. [5] PSoC Mixed Signal Aray Final Datasheet, Cypress MicroSystems, 2004, tr.1-3.

Các file đính kèm theo tài liệu này:

  • doch7879 th7889ng cn t7921 2737897ng s7917 d7909ng trong qu tramp23.doc
Tài liệu liên quan