ĐẶT VẤN ĐỀ Ghép nối qua cổng nối tiếp RS-232 là một trong những kỹ thuật được sử dụng rộng rãi nhất để ghép nối các thiết bị ngoại vi với máy tính.Qua cổng nối tiếp có thể ghép nối chuộ
Trang 1ĐAMH :Tìm hiểu truyền thông nối tiếp 1
MỤC LỤC Trang Lời nói đầu 2
Chương 1 ỨNG DỤNG VISUAL BASIC TRONG TRUYỀN THÔNG NỐI TIẾP 3
1 Đặt vấn đề 3
2 Các đặc tính của MSCOMM 3
3 Truyền nhận dữ liệu theo kiểu text và kiểu binary trong VB 8
4 Truyền nhận dữ liệu theo phương pháp hỏi vòng và dùng ngắt 9
Chương 2 PLC VÀ TRUYỀN THÔNG NỐI TIẾP 13
1 Giới thiệu PLC 13
2 Truyền thông nối tiếp trong PLC 14
Chương 3 CHƯƠNG TRÌNH ỨNG DỤNG 18
1 Giao diện và chương trình VB 18
2 Giải thuật và chương trình PLC 22
Hướng phát triển của đề tài 35
Tài liệu tham khảo 35
Trang 2
Lời nói đầu
Như chúng ta đã biết ,PLC có rất nhiều ứng dụng trong các hệ thống điều khiển hiện nay.Các đối tương mà PLC điều khiển được rất đa dạng từ máy bơm, máy cắt, máy khoan, lò nhiệt cho đến những hệ thống phức tạp như là băng tải,
hệ thống chuyển mạch tự động(ATS), thang máy, dây chuyền sản xuất Nó có thể điều khiển theo các qui luật khác nhau tùy thuộc vào đối tượng của nó.
Nhưng trong đồ án này,ta không đi sâu vào việc sử dụng PLC điều khiển như thế nào mà tìm hiểu về giao thức truyền thông của PLC thông qua cổng giao tiếp
của PLC S7-200.Thêm vào đó đồ án này sẽ chỉ ra cách sử dụng ngôn ngữ Visual Basic (VB) lập trình truy xuất đến cổng nối tiếp RS232 của máy tính PC Nội dung
của đồ án này sẽ là tìm hiểu cách thức truyền dữ liệu qua lại giữa máy tính PC và PLC S7-200 và hiển thị thời gian thực của PLC lên giao diện VB.
Để làm được đồ án này em đã nhận được rất nhiều sự giúp đỡ của các thầy cô giáo bộ môn Vì thế em xin gửi lời cảm ơn chân thành đến thầy Phan Nguyễn Phục Quốc đã chỉ dẫn và giúp đỡ em rất nhiều trong quá trình thực hiện đồ án Em cũng xin gửi lời cám ơn chân thành đến tất cả các thầy cô trong bộ môn Điều khiển tự động ,những người đã truyền đạt cho em những kiến thức vô cùng quí báu trong thời gian làm đồ án cũng như trong suốt những năm học đã qua.
Sau cùng em cũng cần phải nói rằng do đây là lần đầu tiên làm đồ án và cũng
có sự hạn chế về thời gian nên chắc chắn đồ án khong thể tránh được những thiéu sót nhất định Em rất mong nhận được sự góp ý của thầy Quốc , các thầy cô giáo
Trang 3ĐAMH :Tìm hiểu truyền thông nối tiếp 3
Chương I: Ứng dụng Visual basic trong truyền thông nối tiếp
1 ĐẶT VẤN ĐỀ
Ghép nối qua cổng nối tiếp RS-232 là một trong những kỹ thuật được sử dụng rộng rãi nhất để ghép nối các thiết bị ngoại vi với máy tính.Qua cổng nối tiếp có thể ghép nối chuột, môđem,thậm chí cả máy in(chẳng hạn lại máy in Apple), bộ biến đổi A/D , các thiết bị đo lường v.v…Số lượng và chủng loại các thiết bị ngoại vi ghép nối qua cổng nối tiếp đứng hàng đầu trong số các khả năng ghép nối máy tính Cách ghép nối này sử dụng phương pháp truyền thông theo kiểu nối tiếp, trong
đó ở mỗi thời điểm chỉ có một bit được gửi dọc theo đường dẫn.Đặc điểm này khác với phương pháp truyền thông theo kiểu song song, trong đó nhiều bit được gửi đi đồng thời.Ưu điểm chính của kiểu truyền nối tiếp so với truyền song song là một đường dẫn được sử dụng để truyền còn một đường dẫn khác dùng để nhận
Muốn lập trình truy xuất cổng nối tiếp RS-232 của máy tính PC ta có thể sử dụng rất nhiều ngôn ngữ như là Pascal,C,Visual Basic,Visual C++,Delphi…Trong
đồ án này ta sẽ tìm hiểu cách truy xuất cổng nối tiếp RS-232 bằng ngôn ngữ Visual Basic(VB)
Bình thường khi chạy phần mềm VB ta chỉ thấy một số thành phần quen thuộc trên thanh công cụ (toolbar) nhưngVB cho phép nhiều thành phần khác có thể bổ sung thêm vào.Khi muốn thực hiện truy xuất cổng Com bằng VB ta phải bổ xung thêm thành phần điều khiển truyền thông Microsoft Comm thì mới có thể truyền nhận dữ liệu qua cổng nối tiếp.Muốn cài trình truyền thông vào thanh công cụ ta vào project -components- controls chọn Microsoft comm control 6.0,biểu tượng hình chiếc điện thoại sẽ được hiện lên trên thanh công cụ.Sau đó ta đưa đối tượng này vào form của chương trình cũng như những đối tượng giao diện khác trong thanh công cụ.Thành phần Comm khi mới đưa vào form thường được gán tên là Mscomm1 cho cổng com1 và ta có thể sửa tên hay thay đổi cổng com tùy ý
2 CÁC ĐẶC TÍNH CỦA MSCOMM
Các tính chất của MSComm được sắp xếp theo chức năng:
a Thiết lập thông số cho cổng
+ CommPort: dạng object.CommPort = value Value là chỉ số của cổng Com có
giá trị từ 1 ‐> 16 và mặc định có giá trị =1 Cần phải thiết lập thông số này trước khi
mở cổng Sẽ có lỗi error 68 (Device unavailable) nếu như không mở được cổng
này
Trang 4+ InBuferSize: thiết lập hoặc trả lại kích thước của bộ đệm nhận, tính = byte Mặc định là 1024 byte.Không được nhầm lẫn với đặc tính InBufferCount là số byte
đang chờ trong bộ đệm nhận
+ InputLen : object.InputLen [ = value ] thiết lập hoặc trả lại số byte mỗi lần
thuộc tính Input đọc trong bộ đệm nhận Mặc định giá trị Value=0 tức là thuộc tính Input sẽ đọc hết nội dung của bộ đệm nhận khi thuộc tính này được gọi Nếu số kí tự
trong bộ đệm nhận không = InputLen thì thuộc tính Input sẽ trả lại kí tự rỗng “” Ví thế cần phải chọn cách kiểm tra InBufferCount để chắc chắn số kí tự yêu cầu đã có
đủ trước khi dùng lệnh Input Tính chất này rất là có ích khi đọc dữ liệu một máy
mà dữ liệu ra được định dạng bằng các khối có kích thước cố định
+ InputMode: object.InputMode [ = value ]
Value = 0 hay = comInputModeText dữ liệu nhận được dạng văn bản kiểu
kí tự theo chuẩn ANSI Dữ liệu nhận được sẽ là một sâu Value=1 hay =
comInputModeBinary dùng nhận mọi kiểu dữ liệu như kí tự điều khiển nhúng,
kí tự NULL, Giá trị nhận được từ Input sẽ là một mảng kiểu Byte
+ NullDiscard: object.NullDiscard [ = value ] tính chất này quyết định kí tự trống
có được truyền từ cổng đến bộ đệm nhận hay không Nếu value= True kí tự này không được truyền value = false kí tự trống sẽ được truyền Kí tự trống được định nghía theo chuẩn ASCII là kí tự 0 – chr$(0)
+ OutBuferSize: giống như InBuferSize, mặc định là 512.
+ ParityReplace: thiết lập và trả lại kí tự thay thế kí tự không đúng trong lỗi
giống nhau
+ PortOpen: thiết lập và trả lại tính trạng của cổng(đóng hoặc mở).
object.PortOpen [ = value ] value = true cổng mở value =false cổng đóng và xóa
toàn bộ dữ liệu trong bộ đệm nhận và truyền Cần phải thiết lập thuộc tính CommPort đúng với tên của cổng trước khi mở cổng giao tiếp Thêm vào đó, cổng giao tiếp của thiết bị của bạn phải hỗ trợ giá trị trong thuộc tính Setting thì thiết bị của bạn mới hoạt động đúng, còn không thì nó sẽ hoạt động rất dở hơi nếu không nói là nó chạy không tốt Đường DTR và RTS luôn giữ lại trạng thái của cổng
+ RthresHold: object.Rthreshold [ = value ] value kiểu số nguyên Thiết lập số kí
tự nhận được trước khi gây lên sự kiện comEvReceive Mặc định = 0 tức là không
có sự kiện OnComm khi nhận được dữ liệu Thiết lập = 1 tức là sự kiện OnComm
xảy ra khi bất kì kí tự nào được chuyển đến bộ đệm nhận
+ Settings: object.Settings [ = value ] thiết lập hoặc trả lại các thông số tần số
baud, bít dữ liệu, bít chẵn lẻ, bít stop Nếu Value không có giá trị khi mở sẽ gây ra
lỗi 380 (Invalid property value).
Value có dạng "BBBB,P,D,S" Trong đó, BBBB là tốc độ Baud, P : thiết lập bít đồng bộ, D: số bít dữ liệu, S: số bít stop.Mặc định của nó là:"9600,N,8,1"Sau đây là một số tần số bus 110,300,600,1200,2400,4800,9600( mặc định), 1400,19200,28800,38400,56000,115200,128000,256000
Trang 5ĐAMH :Tìm hiểu truyền thông nối tiếp 5
Các giá trị của P: E( even), M: mark, N: none( mặc định), O: old, S: Space.D: có giá trị từ 4-> 8( mặc định) S: số bít stop có giá trị 1, 1.5, 2;
+ SThreshold: thiết lập và và trả lại số kí tự nhỏ nhất được cho phép trong bộ đệm gửi để xảy ra sự kiện OnComm = comEvSend Theo mặc định giá trị này = 0 tức
là khi truyền sẽ không gây ra sự kiện OnComm Nếu thiết lập thông số này =1 thì
sự kiện OnComm xảy ra khi bộ đệm truyền rỗng Sự kiện OnComm =
comEvSend chỉ xảy ra khi mà số kí tự trong bộ đệm truyền nhỏ hơn hoặc = Sthreshold Nếu số kí tự trong bộ đệm này luôn lớn hơn Sthreshold thì sự kiện này
không thể xảy ra
b Truyền nhận dữ liệu
+ CommEvent: trả lại phần lớn sự kiện giao tiếp hoặc có lỗi CommEvent xảy ra
khi có lỗi hoặc khi xảy ra sự kiện nào đó Sau đây là một số hằng số lỗi:
Sự kiện Giá trị Miêu tả sự kiện
comEventBreak 1001 Xảy ra khi nhận được một tín hiệu Break
comEventFrame 1004 Lỗi hệ thống Phần cứng phát hiện ra một lỗi hệ thống
comEventOverrun 1006 Xảy ra khi cổng tự tràn( Overrun) Một kí tự không được
đọc từ phần cứng trước khi kí tự tiếp theo tới và do đó kí tựnày bị mất
comEventRxOver 1008 Xảy ra khi bộ đệm nhận bị tràn Không có đủ chỗ cho
dữ liệu trong bộ đệm nhận
comEventRxParity 1009 Lỗi Parity Phần cứng phát hiện ra một lỗi Parity.
comEventTxFull 1010 xảy ra khi bộ đệm truyền bị đầy Bộ đệm truyền bị đầy
trong khi ghi dữ liệu lớn vào bộ đệmMột số sự kiện :
Sự kiện Giá trị Miêu tả sự kiện
comEvSend 1 Xảy ra khi số kí tự trong bộ đệm truyền nhỏ hơn giá trị
SthresHold(kí tự đã được gửi
comEvReceive 2 Xảy ra khi bộ đệm nhận được số kí tự bằng giá trị
RthresHold Sự kiện này được tạo ra liên tục cho tới khi
dùng thuộc tính Input để lấy hết dữ liệu từ trong
bộ đệm nhận
Trang 6RcomEvCTS 3 Xảy ra khi có thay đổi trong đường CTS( Clear To Send)
comEvDSR 4 Xảy ra khi thay đổi trong đường DSR( Data Set Ready) Sự
kiện này chỉ xảy ra khi đường DSR thay đổi từ mức cao sang thấp
comEvCD 5 Xảy ra khi có thay đổi trong đường CD( Carrier Detect)
comEvRing 6 Phát hiện chuông (Ring).Một số UART không hỗ trợ sự
kiện này
comEvEOF 7 Xảy ra khi nhận được kí tự kết thúc file ( kí tự 26 trong
bảng mã ASCII)
+ EOFEnable : object.EOFEnable [ = value ] quyết định các hành động nếu
MSComm tìm thấy kí tự kết thúc file Nếu value=true khi tìm thấy kí tự kết thúc file
thì sẽ gây lên sự kiện comEvEOF trong OnCommEvent Nếu value= false thì sẽ
không gây lên sự kiện này
+ InBufferCount: trả lại số kí tự đang có trong bộ đệm nhận.Có thể xoá bộ đệm nhận bằng cách đặt thuộc tính này =0 Không nhầm với thuộc tính InBufferSize là
tổng kích thước của bộ đệm nhận
+ Input: nhận và xoá dữ liệu trong bộ đệm nhận.
Nếu InputMode là comInputModeText thì giá trị trả về sẽ là một xâu tức có kiểu String , dữ liệu dạng text trong một biến kiểu Variant Nếu InputMode =
comInputModeBinary thì thuộc tính này sẽ trả lại dữ liệu dạng nhị phân dưới
dạng một mảng kiểu byte trong một biến Variant.Ta sẽ xét kĩ hơn về thuộc tính này trong phần sau
+ OutBufferCount: trả lại số kí tự trong bộ đệm truyền.
+ Output: ghi dữ liệu vào bộ đệm truyền có thể truyền kiểu text hoặc kiểu nhị
phân Nếu truyền bằng kiểu text thì cho một biến Variant = kiểu String, nếu truyền kiểu nhị phân thì cho Output= variant = một mảng kiểu Byte.Thuộc tính này sẽ được xét kĩ hơn ở phần sau
c Một số đặc tính khác:
+ Break : thiết lập hoặc xoá tín hiệu object.Break [ = value] value = true để thiết
lập hoặc false để xóa Khi set value= true thì thông số Break này sẽ gửi một tín hiệu break Tín hiệu break trì hoàn việc truyền dữ liệu và đưa đường truyền vào trạng thái break tới khi mà value = false
+CDTimeout : Đặc tính này đặt và trả lại giá trị cực đại của thời gian (tính bằng
mili giây).Đây là khoảng thời gian điều khiển đợi tín hiệu phát hiện được tín hiệu mang trước một timeout.Đặc tính này chỉ ra thời gian vượt quá bằng việc đặt thông
Trang 7ĐAMH :Tìm hiểu truyền thông nối tiếp 7
số đặc tính CommEvent thành CDTO ( Carrier Detect Timeout Error) và phát sinh
sự kiện OnComm.Cú Pháp của câu lệnh là
MSComm.CDTimeout[=miliseconds&]
+ CDHolding: quyết định xem sự truyền này đến đâu bằng cách truy vấn đường
CD( Carrier Detect) Carrier Detect là tín hiệu gửi từ modem tới máy tính kết nối với nó thống báo rằng nó đang online Nếu giá trị = False và thời gian đợi tín hiệu
CD trôi qua,điều khiển truyền thông đặt đặc tính CommEvent thành CDTO ( Carrier Detect Timeout Error) và phát sinh sự kiện Oncomm
+ CTSHolding: quyết định khi nào ta gửi dữ liệu bằng cách truy vấn trạng thái
đường Clear To Send (CTS) Thông thường tín hiệu CTS được gửi từ modem tới máy tính kết nối với nó để báo rằng đang quá trình truyền dữ liệu Thuộc tính Readonly chỉ xuất hiện khi chạy chương trình Đường Clear To Send dùng trong
RTS/CTS (Request To Send/Clear To Send) bắt tay phần cứng CTSHolding cho ta
một cách để tự tay dò đường Clear To Send nếu cần biết trạng thái của nó
+ DSRHolding: biết trạng thái của đường Data Set Ready (DSR) Tín hiệu Data
SetReady truyền từ modem tới máy tính nối với nó để thông báo rằng modem đã sẵn sàng hoạt động Nếu như thông số được đặt là True thì dường dẫn DSR ở mức cao (High), nếu không thì là thấp (Low) Cú pháp của câu lệnh như sau:
Mscomm.DSRholding [=settings]
+ DTREnable: tính chất này quyết định khi nào cho phép đường Data Terminal
Ready (DTR) trong truyền thông Tín hiệu DTR gửi từ máy tính tới modem để báo rằng máy tính sẵn sàng là nơi nhận dữ liệu Khi DTREnable = true thì đường Data Terminal Ready set lên cao khi cổng mở, và thấp khi cổng đóng Nếu DTREnable = false thì đường đó luôn mức thấp Trong phần lớn trường hợp set đường Data Terminal Ready thành thấp để hang up telephone
+ Handshaking : Đặc tính này cho phép thiết lập và trả lại giao thức băt tay phần
cứng.object.Handshaking [ = value ]
Các giá trị của value:
comNone 0 (Mặc định) Không bắt tay
comXOnXOff 1 Bắt tay XON/XOFF
comRTS 2 Bắt tay RTS/CTS (Request To Send/Clear To Send)
comRTSXOnXOff 3 Dùng cả bắt tay Request To Send and XON/XOFF
Handshaking chỉ là giao thức truyền thông nội tại quyết định bởi dữ liệu nào được
truyền từ cổng phần cứng tới bộ đệm nhận Khi kí tự của dữ liệu tới cổng nối tiếp, thiết bị truyền thông sẽ chuyển nó vào trong bộ đệm nhận và chương trình ta viết có thể đọc chúng Nếu không có bộ đệm dữ liệu hoặc chương trình của ta phải đọc kí
tự trực tiếp từ phần cứng , thì rất có thể mất dữ liệu bởi vì kí tự từ phần cứng đến rất
nhanh Giao thức Handshaking đảm bảo dữ liệu không bị mất, khi dữ liệu đến
Trang 8cổng quá nhanh thì thiết bị truyền thông sẽ chuyển dữ liệu vào trong bộ đệm nhận.
+ RTSEnable: quyết định khi nào cho phép đường Request To Send (RTS).Thí dụ
như tín hiệu RTS yêu cầu sự cho phép truyền dữ liệu từ máy tính tới modem Khi RTSEnable = true thì đường RTS mức cao ( trạng thái cho phép), Ngược lại xác lập bằng False để đưa đường RTS xuống mức không tích cực.RTS dùng trong RTS/CTS hardware handshaking RTSEnable cho phép dò đường RTS khi cần biết tình trạng của đường này Các tính chất trên không có lúc thiết kế giao diện mà chỉ
có lúc chạy chương trình ( dùng trong viết code)
+DSRTimeout : Đặt và trả lại số mili giây để chờ đợi tín hiệu DSR trước khi sự
kiện Oncomm xuất hiện.Cú pháp của câu lệnh là:
MSComm.DSRTimeout [=miliseconds&]
+CTSTimeout : Đặt và trả lại số mili giây để chờ đợi tín hiệu CTS trước khi đặt
đặc tính CommEvent thành CTSTO và phát sinh sự kiện Oncomm xuất hiện.Cú pháp của câu lệnh là:
MSComm.CTSTimeout [=miliseconds&]
3 TRUYỀN NHẬN DỮ LIỆU KIỂU TEXT VÀ NHỊ PHÂN TRONG VB
VB cho phép truyền dữ liệu dạng Text hay là dạng Binary Thuộc tính InputMode quyết định điều khiển MSComm dùng dạng nào
a.Kiểu văn bản( Text):
Với thuộc tính InputMode = comInputModeText thì MSComm sẽ gửi và nhận
dữ liệu dạng xâu theo chuẩn ANSI ( không phải chuẩn ASCII) Để gửi một xâu ra port,cần phải gán thuộc tính Output của MSComm là một xâu.Ví dụ:
Dim SampleText as String
‘ví dụ muốn truyền một xâu “ABC”
Dim SampleText as String
SampleText = MSComm1.Input
‘ khi đó SampleText sẽ là dữ liệu đọc được
MSComm lưu trữ mỗi mã ANSI 8 bít như một kí tự văn bản
Thực tế giá trị truyền cho MSComm1.Output phải là kiểu Variant Ở đây thuộc
Trang 9ĐAMH :Tìm hiểu truyền thông nối tiếp 9
tính Output chấp nhận kiểu một biến Variant chứa một xâu kí tự và MSComm sẽ đọc xâu kí tự và gán tự động vào một biến Variant vì Variant chính là kiểu của Output Nói cách khác ở đây có sự chuyển kiểu ngầm định giữa kiểu String sang Variant
b Kiểu nhị phân( Binary):
Để truyền dữ liệu dưới dạng nhị phân,cần thiết lập thuộc tính InputMode của MSComm thành comInputModeBinary
+ Bước 1: Lưu trữ mảng kiểu byte vào một biến variant
+ Bước 2: gửi dữ liệu đi bằng cách thiết lập thông số Output của MSComm bằng biến Variant đó
Dim BytesToSend(0 to 1) as Byte ‘ khai báo một mảng 2 phần tử
Dim Buffer as Variant
‘ lưu trữ dữ liệu vào mảng kiểu byte ở trên
Dim BytesReceived() as Byte ‘ khai báo một mảng động
Dim Buffer as Variant ‘ khai báo biến variant
‘đọc dữ liệu từ cổng nối tiếp
Buffer = MSComm1.Input
‘ ghi dữ liệu đọc được vào mảng động
BytesReceived() = Buffer
Lưu ý là phải khai báo một mảng byte động
4 TRUYỀN NHẬN DỮ LIỆU THEO PHƯƠNG PHÁP HỎI VÒNG VÀ DÙNG NGẮT
a Phương pháp hỏi vòng
+ Khi muốn gửi dữ liệu:
Trang 10Khi gửi một khối nhỏ dữ liệu, cần phải thiết lập thuộc tính OutBuferSize phải lớn hơn hoặc bằng số lượng lớn nhất các byte mà các bạn cần chuyển trong một lần Đối với việc truyền dữ liệu có tính lâu dài về thời gian dùng OutBufferCount để chắc chắn rằng bộ đệm không bị tràn Khi có nhiều dữ liệu cần gửi để tránh cho tràn
bộ đệm , ta nên đọc giá trị của OutBufferCount và so sánh với giá trị của OutBufferCount để kiểm tra xem bộ đệm còn bao nhiêu sau khi gửi dữ liệu đầu tiên Sau đó làm đầy bộ đệm bằng cách ghi số byte đó vào bộ đệm thì bộ đệm sẽ không
bị tràn
+ Khi muốn nhận dữ liệu :Kỹ thuật này qui định là sẽ nhận dữ liệu bằng cách kiểm tra liên tục số kí tự nhận được trong bộ đệm nhận ( InBuferCount ).Khi bộ đếm chỉ rằng một số các kí tự mà ứng dụng cần đã đến( như muốn lấy 5 byte chẳng hạn) thì ứng dụng sẽ đọc dữ liệu với thuộc tính Input của MSComm
Thuộc tính InBuferSize phải đủ độ rộng để cho lượng lớn nhất dữ liệu có thể tới
mà không bị mất trước khi MSComm có thể đọc chúng Nếu dữ liệu đến bằng các block với kích thước cố định thì cần thiết lập thuộc tính InBufferSize bằng bội số của kích thước 1 block
Phương pháp dùng ngắt để truyền nhận dữ liệu chính là sử dụng chương trình
con OnComm của MSComm Sự kiện OnComm được phát sinh bất cứ khi nào giá
trị của đặc tính CommEvent thay đổi.Sự kiện :
Private Sub MSComm_OnComm()
Đặc tính CommEvent chứa mã số lỗi hay sự kiện phát sinh bởi sụ kiện OnComm.Các lỗi và sự kiên bao gồm:
Lỗi:
Case ComEventBreak ‘Nhận Break
Case ComEventFrame ‘Sai frame
Case ComEventOverrun ‘Mất dữ liệu
Case ComEventRXOver ‘Đệm thu tràn
Case ComEventRXParity ‘Sai Parity
Case ComEventTXFull ‘Đệm phát đầy
Case ComEventDCB ‘Sai khi đọc DCB
Sự kiện :
Case ComEvCD ‘Đường CD thay đổi
Case ComEvCTS ‘CTS thay đổi
Case ComEvDSR ‘DSR thay đổi từ 1 xuống 0
Trang 11ĐAMH :Tìm hiểu truyền thông nối tiếp
11
Case ComEvRing ‘RI thay đổi
Case ComEvReceive ‘Số byte đệm thu đạt mức Rthreshold
Case ComEvSend ‘ Số byte đệm phát ít hơn Sthreshold
OutBufferSize thì ứng dụng không thể ghi tất cả dữ liệu vào bộ đệm một lần được, nếu cứ ghi vào thì bộ đệm sẽ bị tràn Ta có thể dùng OnComm để truyền đi một dung lượng lớn dữ liệu một cách có hiệu quả bằng cách luôn luôn phải đảm bảo cho
bộ đệm truyền không bao giơ rỗng hoặc bị tràn
Thuộc tính SThreshold quyết định số kí tự trong bộ đệm gửi sẽ gây ra sự kiện OnComm.Ví dụ
MScommm1.SThreshold = 256
Cách truyền như sau: trong lần truyền đầu tiên dùng thuộc tính Output để điền đầy bộ đệm
MSComm1.Output = DataToSend
Khi số kí tự trong bộ đệm giảm từ (SThreshold +1) xuống SThreshold thì sẽ gây
ra sự kiện comEvSend và nhảy đến chương trình con OnComm Dựa vào sự kiện comEvSend chúng ta lại truyền tiếp dữ liệu, cứ thế một dữ liệu dung lượng lớn sẽ đựoc truyền đi
Ví dụ ta có bộ đệm truyền bằng 1024 byte mà ta cần truyền một file có dung lượng 32k, ứng dụng có thể thiết lập SThreshold =256 Để gửi ta làm như sau: lần đầu tiên ghi ra bộ đệm 1024 byte để làm đầy bộ đệm truyền và cổng bắt đầu gửi dữ liệu đi từng byte theo kiểu truyền từng bít một.Do đó số byte trong bộ đệm sẽ giảm dần Khi trong bộ đệm vẫn còn 256 byte nữa thì sẽ gây ra sự kiện comEvSend và trong chương trình con MSComm ta có thể gửi tiếp một lượng dữ liệu mới = 1024-
256 = 768 byte để làm đầy lại bộ đệm Khi đó quá trình lại diễn ra liên tục đến khi
ta gửi hết file
Nếu tổng dung lượng của thông tin cần gửi nhỏ hơn OutBufferSize thì không cần dùng OnComm trong trường hợp này Ứng dụng có thể ghi trực tiếp dữ liệu vào
bộ đệm nhận.Thiết lập SThreshold = 0 để vô hiệu hoá sự kiện comEvSend và khi đó
sẽ không có sự kiện gửi xẩy ra
+ Khi muốn nhận dữ liệu, OnComm cung cấp một cách đơn giản và hiệu quả để phát hiện khi nào dữ liệu được nhận tại cổng Thuộc tính Rtheshold của MSComm quyết định số kí tự ít nhất được nhận để gây sự kiện OnComm
MSComm1.Rthreshold=1
Khi bộ đệm nhận bao gồm 1 hoặc nhiều kí tự, ứng dụng sẽ nhẩy đến chương trình con OnComm Bảng ngắt có trách nhiệm phát hiện sự kiện ComEvReceive xảy
ra và đọc dữ liệu trong bộ đệm nhận
Trang 12Case ComEvReceive
ComEvReceive Buffer = MSComm1.Input
Các lỗi khi sử dụng MSComm trình bày trong bảng sau:
Trang 13ĐAMH :Tìm hiểu truyền thơng nối tiếp
Để có thể thực hiện được một chương trình điều khiển ,tất nhiên PLC phải có tính năng như một máy tính ,nghĩa là phải có một bộ vi xử lí (CPU) ,một hệ điều hành ,một bộ nhớ để lưu chương trình điều khiển ,dữ liệu và tất nhiên là
Thiết bị điều khiển Logic khả trình PLC ( Programmable Logic Control) là loại thiết bị cho phép thực hiện linh hoạt các thuật toán điều khiển số thông qua một ngôn ngữ lập trình ,thay cho việc phải thể hiện thuật toán đó bằng các mạch số Như vậy với chương trình điều trong mình .PLC trở thành bộ điều khiển số nhỏ gọn ,dễ dàng thay đổi thuật toán và đặc biệt dễ dàng trao đổi thông tin với môi trường xung quanh ( Với các PLC khác hoặc với máy tính)
Trang 14phải có các cổng vào ra để giao tiếp với các đối tượng điều khiển và để trao đổi thông tin với môi trường xung quanh Bên cạnh đó nhằm phục vụ các bài toán điều khiển số ,PLC còn cần phải có thêm những khối chức năng đặc biệt khác như bộ đếm ( Counter),bộ định thời gian ( Timer) ….Và những khối hàm chuyên dụng.
2 TRUYỀN THƠNG NỐI TIẾP TRONG PLC
PLC cĩ một hoặc hai cổng ( port 0 , port 1) dùng để truyền thơng nối tiếp
RS-485 ( CPU 214 chỉ cĩ một cổng là port 0)
Thơng qua cổng nối tiếp cĩ thể ghép S7-200 với các thiết bị khác như S7-200 , S7-300 , PC Muốn sử dụng cổng nối tiếp theo giao thức người dùng ta phải dặt cổng ở chế độ freeport bằng cách đặt nội dung cho SMB30 (port 0) và SMB130 ( port 1) theo bảng dưới đây
Ví dụ muốn truyền thơng nối tiếp chế độ freeport tốc độ baud 9600 , 8 bit dữ liệu , khơng parity ta đưa giá trị 00001001 ( số 9) vào thanh ghi SMB30 ( port 0)
Ở chế độ freeport cĩ thể truyền và nhận data bằng hai lệnh XMT và RCV Dữ liệu truyền lấy từ bảng cĩ địa chỉ đầu ở TABLE , cịn dữ liệu nhận về chứa vào TABLE , chiều dài tối đa 255 byte Byte đầu của bảng cho biết chiều dài khối dữ liệu
Trang 15
ĐAMH :Tìm hiểu truyền thông nối tiếp
9 Truyền xong port 0
23 Nhận xong bản tin ở port 0
24 Nhận xong bản tin ở port 1
25 Nhận kí tự ở port 1
26 Truyền xong port 1 Như đã nói ở trên ta có thể sử dụng các ô nhớ SMB86-SMB94 và SMB186- SMB194 để đặt cấu hình cho việc thu bản tin.Phần dưới đây sẽ trình bày chi tiết về các ô nhơ đặc biệt này
SMB86 SMB186 Đây là byte trạng thái nhận dữ liệu
n: 1 = chức năng nhận kết thúc: người dùng đưa ra lệnh không
thực hiện được r: 1= chức năng nhân kết thúc: lỗi ở thông số đầu vào e: 1= kí tự cuối cùng được nhận
t: 1= chức năng nhận kết thúc: hết thời gian c: 1= chức năng nhận kết thúc : số kí tự lớn nhất đã đạt được p: 1= lỗi parity
Trang 16SMB87 SMB187 Đây là byte điều khiển việc nhận dữ liệu
en: 0 = chức năng nhận không thể thực hiện 1= chức năng nhận có thể thực hiệnsc: 0= phớt lờ byte SMB88 và SMB188 1=sử dụng giá trị của SMB88 và SMB188 để dò ki tự khởi đầuec: 0=phớt lờ byte SMB89 và SMB189
1= sử dụng giá trị của SMB89 và SMB189 để dò ki tự kết thúc il: 0 = phớt lờ nội dung SMW90 và SMW190
1= sử dụng giá trị của SMW90 và SMW190 để dò xem điều kiện đường truyền rãnh
c/m : 0 = timer là một timer intercharacter 1= timer là một timer message
SMB89 SMB189 kí tự kết thúc
SMW90 SMW190 thời gian đường truyền rãnh(ms)
kí tự đầu tiên sẽ được nhận sau khoảng thời gian nàySMW92 SMW192 giá trị thời gian của timer intercharacter hoặc message(ms).Nếu
khoảng thời gian này đạt đén , chức năng nhận sẽ kết thúc
SMB94 SMB194 số lượng lớn nhất các kí tự ta nhận
∗ Lệnh nhận dữ liệu hỗ trợ một vài điều kiên để bắt đầu nhận:
Dò đường truyền rãnh: điều kiện đường truyền rãnh được định nghĩa là khoảng thời gian không có dữ liệu trên đường truyền.Việc nhận chỉ có thể bắt đầu khi mà đường giao tiếp rãnh trong số mili giây là giá trị của ô nhớ SMW90 hoặc SMW190.Khi lệnh nhận thực thi nó sẽ kiểm tra điều kiện rãnh này.Nếu bất kì kí tự nào nhận trước khi đạt đến thời gian trong ô nhớ SMW90 hoặc SMW190 thì nó sẽ phớt lờ kí tự này và việc kiểm tra điều kiện đường truyền rãnh được lặp lại từ đầu
Dò kí tự đầu tiên: kí tự đầu tiên là bất cứ kí tự nào được sử dụng như là kí tự đầu tiên của thông điệp gửi về.Thông điệp chỉ có thể nhận được khi ta nhận được kí tự giống như kí tự trong ô nhớ SMB88 hoặc SMB188.Tất cả những kí tự trước kí tự này đều bị bỏ qua
Trang 17ĐAMH :Tìm hiểu truyền thông nối tiếp
17
Kết hợp dò đường truyền rãnh và dò kí tự đầu tiên: ta có thể kết hợp cả hai điều kiện này.Khi lệnh nhận thực thi, chương trình sẽ kiểm tra điều kiện đường truyền rãnh , sau đó sẽ kiểm tra xem kí tự nhận về là gì.Nếu kí tự nhận về không phải là kí
tự trong SMB88 hoặc SMB188 thì việc kiểm tra đường truyền rãnh được lặp lại Ngoài ra còn có một vài điều kiện khác để bắt đầu nhận thông điệp (như điều kiện break…)
∗ Lệnh nhận dữ liệu cũng hổ trợ một vài điều kiện để kết thúc việc nhận:
Dò kí tự kết thúc:Nếu như ta nhận được một kí tự giống với kí tự có trong ô nhớ SMB89 hoặc SMB189 thì việc nhận sẽ kết thúc
Timer intercharacter: khoảng thời gian intercharacter là khoảng thời gian được tính từ lúc nhận xong kí tự thứ nhất( bit stop) đến luc nhận được bit stop của kí tự tiếp theo Khoảng thời gian này tính là mili giây và là giá trị của ô nhớ SMW92 hoặc SMW192.Nếu thời gian từ khi nhận được bit stop của kí tự thứ nhất đến khí nhận bit stop của kí trị tiếp theo đạt đến thời gian trong SMW92 (SMW192) thì chức năng nhận sẽ kết thúc
Timer message: chức năng này sẽ kết thúc một thông điệp vào khoảng thời gian nhất định sau khi bắt đầu nhận dữ liệu.Timer này sẽ bắt đầu ngay khi bắt đàu nhận
dữ liệu.Số mili giây của timer này là giá trị ô nhớ SMW92 hoặc SMW192
Số kí tự lớn nhất đạt được: số kí tự lớn nhất là giá trị của ô nhớ SMB94 hoặc SMB194.Khi nhận đủ số kí tự này thì chức năng nhận sẽ kết thúc
Lỗi Parity: chức năng nhận sẽ tự động kết thúc khi phần cứng báo hiệu có lỗi parity trong dữ liệu nhận về.Lỗi parity chỉ có thể khi chức năng parity được lập sẵn trong ô nhơ SMB30 hoặc SMB130( bit 7 và bit 6)
Người dùng kết thúc:ta có thể cho kết thúc ngay việc nhận khi ta set bit EN trong
ô nhơ SMB87 hoặc SMB187 về 0.Chức năng nhận sẽ kết thúc ngay lập tức
Trang 18Chương III CHƯƠNG TRÌNH ỨNG DỤNG
Trong chương này , ta sẽ viết một chương trình ứng dụng sử dụng những kiến thức đã biết về Visual Basic và PLC trong truyền thông.Yêu cầu của chương trình này là ghi thời gian của máy tính PC cho PLC và hiển thị thời gian của PLC lên máy tính khi có yêu cầu
Với yêu cầu như vậy, ta sẽ có hai đoạn chương trình: một là của PLC và chương trình còn lại được viết bằng VB.Phần dưới đây sẽ trình bày giải thuật và mã nguồn chương trình
1 GIAO DIỆN VÀ CHƯƠNG TRÌNH VB
Trước khi viết chương trình ta tạo một giao diện như sau bằng VB