Mô tả chức năng truyền thông của phần mềm (HMI)

Một phần của tài liệu Xây dựng phần mềm giao diện người máy (hmi) (Trang 34 - 42)

Chương 2: XÂY DỰNG PHẦN MỀM GIAO ĐIỆN NGƯỜI MÁY (HMI)

2.3. Xây dựng phần mềm giao diện người máy (HMI)

2.3.4. Mô tả chức năng truyền thông của phần mềm (HMI)

Phần này mô tả chức năng truyền thông của phần mềm a. Kết nối:

Thủ tục Connect được dùng để mở cổng COM. Thủ tục này được gọi mỗi khi người sử dụng ấn Connect để kết nối, cổng COM được kiểm tra trạng thái trước khi mở, nó chỉ được mở khi khi trước đó nó chưa được mở.

Private Sub mnuConnect_Click()

'=======================================================

'Mô tả: Thủ tục để mở cổng COM

'=======================================================

On Error Resume Next With Me.comPLC

‘Nếu cổng COM đang được mở thì trmComm ngừng hoạt động và Shape chuyển thành màu đỏ và đóng cổng COM

If .PortOpen = True Then

Me.trmComm.Enabled = False Me.shpState.FillColor = vbRed .PortOpen = False

‘Không thì cổng COM được mở Else

.PortOpen = True

‘Nếu có lỗi kết nối thì hiện thông báo cổng COM không có hiệu lực If Err.Number <> 0 Then

MsgBox "Com" & .CommPort & " is not available." & vbCrLf & _

Err.Description

Err.Clear End If

Me.shpState.FillColor = vbGreen End If

End With

‘Nếu chọn kiểu dữ liệu dạng Text If Me.mnuTB(0).Checked Then

Me.comPLC.InputMode = comInputModeText blnBinaryMode = False

Else

‘Không thì chọn kiểu dữ liệu là Binary

Me.comPLC.InputMode = comInputModeBinary blnBinaryMode = True

End If

‘Cập nhật trạng thái cho StatusBar (Xem trong phụ lục B.1) UpdateStatus

End Sub

b. Truyền dữ liệu đặt xuống PLC:

Thủ tục đặt dữ liệu xuống PLC sử dụng cmdSetPLC để đặt xuống PLC. Thủ tục này nhận một thông số dạng chuỗi strSend là dữ liệu cần truyền. Nếu có lệnh đặt

xuống PLC thì dữ liệu sẽ được truyền đi nhờ sử dụng thuộc tính Output của MSComm control.

Private Sub cmdSetPLC_Click()

'=======================================================

'Mô tả: thủ tục truyền dữ liệu qua cổng COM.

'=======================================================

Dim X() As Byte

Dim strSend As String Dim I As Integer

Dim IB As String Dim QB As String Dim MB As String Dim VB As String Dim IW As String Dim QW As String Dim MW As String Dim VW As String ‘Biến cho các text truyền Dim A(0 To 3) Dim J As Integer For I = 0 To 3

If Combo2(I).Text = "Binary" Or Combo2(I).Text =

"Decimal" Then

‘Biến cho các text truyền

If Trim(Me.Text1(I).Text) = "" Then

MsgBox "Chua nhap gia tri truyen cho o thu" &

CStr(I) & ".", vbExclamation Me.Text1(I).SetFocus Exit Sub

‘Nếu giá trị đặt không phải là số

ElseIf Not IsNumeric(Me.Text1(I).Text) Then MsgBox "Gia tri dat phai la so.", vbExclamation

Me.Text1(I).SetFocus Exit Sub

End If End If Next

… (Xem thêm trong phần phụ lục B.1) ‘Biến giá trị là Binary

'IB

If Combo2(0).Text = "Binary" And Combo1(0).Text =

"IB0" Then

IB = 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &

0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &

Me.Text1(0).Text

‘Chuyển giá trị Binary thành Decimal và gán cho A(0) Bin2Dec IB

A(0) = Decimal1 End If

… (Xem thêm trong phần phụ lục B.1) ‘Biến giá trị là Bits

'IB

If Combo2(0).Text = "Bits" And Combo1(0).Text =

"IB0" Then

IB = 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &

0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &

Check1(0) & Check2(0) & Check3(0) & Check4(0) &

Check5(0) & Check6(0) & Check7(0) & Check8(0) Bin2Dec IB

A(0) = Decimal1 End If

… (Xem thêm trong phần phụ lục B.1) ‘Biến giá trị là Decimal

'IB

If Combo2(0).Text = "Decimal" And Combo1(0).Text =

"IB0" Then

IB = 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &

0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &

ToBin(Me.Text1(0).Text) Bin2Dec IB

A(0) = Decimal1 End If

… (Xem thêm trong phần phụ lục B.1) ‘Biến giá trị là Decimal

'IW

If Combo2(0).Text = "Decimal" And Combo1(0).Text =

"IW0" Then

IW = 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &

0 & 0 & 0 & 0 & ToBin(Val("&H" & Mid(Right("0000" &

Hex(Me.Text1(0).Text), 4), 1, 2))) & ToBin(Val("&H" &

Mid(Right("0000" & Hex(Me.Text1(0).Text), 4), 3, 4))) Bin2Dec IW

A(0) = Decimal1 End If

… (Xem thêm trong phần phụ lục B.1) ‘Biến giá trị là Decimal

'ID

If Combo2(0).Text = "Decimal" And Combo1(0).Text =

"ID0" Then

A(0) = Me.Text1(0).Text End If

… (Xem thêm trong phần phụ lục B.1)

‘Chọn kiểu khung truyền có byte start và không có byte start If Me.mnulf(0).Checked Then

strSend = vbLf & "A" & Right("00000000" &

Hex(A(0)), 8) & Right("00000000" & Hex(A(1)), 8) &

Right("00000000" & Hex(A(2)), 8) & Right("00000000" &

Hex(A(3)), 8) & Right("00000000" &

Hex(Me.Text1(4).Text), 8) & Right("00000000" &

Hex(Me.Text1(5).Text), 8) & vbCr Else

strSend = "A" & Right("00000000" & Hex(A(0)), 8)

& Right("00000000" & Hex(A(1)), 8) & Right("00000000" &

Hex(A(2)), 8) & Right("00000000" & Hex(A(3)), 8) &

Right("00000000" & Hex(Me.Text1(4).Text), 8) &

Right("00000000" & Hex(Me.Text1(5).Text), 8) & vbCr End If

X = StrConv(strSend, vbFromUnicode) Me.comPLC.Output = X

End Sub

c. Gửi yêu cầu đọc trạng thái:

Yêu cầu đọc trạng thái PLC được gửi ở thủ tục xử lý sự kiện Timer của Timer tmrComm. Thuộc tính Interval của timer này được đặt bằng 50. Như vậy sự kiện timer xảy ra cứ mỗi 50 ms. Nghĩa là cứ 50 ms thì có một yêu cầu đọc trạng thái được gửi đi. Yêu cầu đọc trạng thái của PLC chỉ bao gồm một ký tự “B” duy nhất.

Private Sub trmComm_Timer()

'=======================================================

'Mô tả: Thủ tục yêu cầu đọc dữ liệu từ PLC

'=======================================================

Dim X() As Byte

Dim strSend As String

‘Nếu chọn kiểu dữ liệu không có byte start If Me.mnulf(0).Checked Then strSend = vbLf & "B" & vbCr Else

‘Không thì

strSend = "B" & vbCr

End If

X = StrConv(strSend, vbFromUnicode) Me.comPLC.Output = X

End Sub d. Nhận dữ liệu:

Dữ liệu được nhận ở thủ tục xử lý sự kiện OnComm của MSComm control.

Với thuộc tính Rthreshold có giá trị bằng 1, sự kiện này xảy ra mỗi khi nhận được một ký tự ở cổng COM. Ký tự này sẽ được đọc sử dụng thuộc tính Input của control và chuyển cho thủ tục xử lý dữ liệu.

Private Sub comPLC_OnComm()

'=======================================================

'Mô tả: Thủ tục sự kiện OnComm

'=======================================================

Dim EventMsg As String

Select Case Me.comPLC.CommEvent 'Sự kiện nhận được dữ liệu

Case comEvReceive

Dim Buffer As Variant

'Đọc dữ liệu từ bộ đệm vào biến Buffer Buffer = comPLC.Input

'Nếu dữ liệu là kiểu Binary If blnBinaryMode Then

'Xử lý dữ liệu nhận được

ScanBinaryData Buffer Else

ScanTextData Buffer End If

… (Xem thêm trong phần phụ lục B.1) End Select

End Sub e. Xử lý dữ liệu:

Dữ liệu nhận được sẽ được xử lý và hiển thị lên giao diện ở các thủ tục ScanTextData, ScanBinaryData và ShowData. Thủ túc ScanTextData sử dụng một biến tĩnh strData để giữ thông điệp. Thủ tục này kiểm tra mỗi ký tự nhận được xem có phải là ký tự kết thúc thông điệp không. Nếu đúng, thông điệp được chuyển qua thủ tục ShowData để xử lý tiếp.

Private Sub ScanTextData(Data As Variant)

'=======================================================

'Mô tả: thủ tục xử lý dữ liệu nhận được qua cổng COM dạng Text

'=======================================================

Static strData As String Dim I As Long

For I = 1 To Len(Data) 'Xử lý từng ký tự

If Mid(Data, I, 1) = vbCr Then 'Nếu là ký tự kết thúc thông điệp,

'chuyển thông điệp để xử lý ShowData strData

'Xóa biến để nhận thông điệp khác strData = ""

Else

'Nếu không phải ký tự kết thúc thông điệp, 'nối ký tự nhận được vào thông điệp

strData = strData & Mid(Data, I, 1) End If

Next I End Sub

Private Sub ScanBinaryData(Data As Variant)

'=======================================================

'Mô tả: thủ tục xử lý dữ liệu nhận được qua cổng COM dạng Binary

'=======================================================

Static strData As String

Dim I As Long

For I = LBound(Data) To UBound(Data) If Data(I) = 13 Then

ShowData strData strData = ""

Else

strData = strData & Chr(Data(I)) End If

Next I End Sub

Thủ tục ShowData sẽ kiểm tra ký tự đầu của thông điệp để xác định dữ liệu đã được nhận hay chưa. Nếu ký tự đầu là “D” nghĩa là dữ liệu nhận đã đúng, các dữ liệu sẽ được chuyển từ chuỗi chứ số HEX sang giá trị thập phân, nhị phân và được sử dụng để cập nhật trạng thái của các biến từ PLC. Thủ tục ShowData và chương trình chuyển đổi dữ liệu từ thập phân sang nhị phân tham khảo code phần Phụ lục B.1.

Một phần của tài liệu Xây dựng phần mềm giao diện người máy (hmi) (Trang 34 - 42)

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

(133 trang)