• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

lỗi floating point khi đọc và hiển thị giá trị từ thanh ghi

Góc trao đổi, hỏi đáp của ngôn ngữ Visual Basic 6 và Visual Basic Script

Điều hành viên: tungblt

thachbk
Bài viết: 5
Ngày tham gia: T.Năm 16/03/2017 9:48 pm
Has thanked: 1 time

lỗi floating point khi đọc và hiển thị giá trị từ thanh ghi

Gửi bàigửi bởi thachbk » T.Ba 23/05/2017 7:50 pm

Chào mọi người, em có đoạn code dùng để đọc dữ liệu trong thanh ghi của 1 parameter (kết nối với máy tính qua cổng com, giao thức modbus) muốn nhờ mọi người xem giùm ạ:

Mã: Chọn hết

Declare Sub CopyMemory Lib "kernel32" alias "RtlMoveMemory"(ByRef dest as Any,ByRef source As Any, Byval numbytes As Long)

Dim MyData(2) As Long
Dim fValue As Single

'******Get two 16 registers and read into MyData Array******
For i = 0 To 1

MyStatus = MbMasterV71.ReadResults(hConnect, Slave_Address, Command, Address + i, MyData(i)) (dòng này để đọc thanh ghi, slave: địa chỉ slave, command: function holdingregister, address: địa chỉ thanh ghi đầu, giá trị đọc được lưu vào mydata)

Next i

'*****Copy the data from the register array******
CopyMemory fValue, MyData(0), 4

Đoạn code này để đọc giá trị trong thanh ghi dạng floating point và hiển thị ra textbox, vấn đề ở đây là e thường xuyên gặp lỗi overflow mà không biết phải sửa ở đâu ạ. Mong mọi người chỉ giáo.



Hình đại diện của người dùng
Dark.Cosmos
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 71
Ngày tham gia: T.Sáu 21/11/2014 3:58 am
Has thanked: 24 time
Been thanked: 14 time
Liên hệ:

Re: lỗi floating point khi đọc và hiển thị giá trị từ thanh ghi

Gửi bàigửi bởi Dark.Cosmos » T.Năm 13/07/2017 1:29 pm

Cái này mình chưa bao giờ đụng tới, nhưng ngó sơ qua có thấy vài điểm bất thường:
'******Get two 16 registers and read into MyData Array******
Ở cái ghi chú này mình thấy nó ghi lấy 2 lần thanh ghi 16, hình như tổng cộng của cả 2 lần chỉ có 4 byte thôi => 1 lần là 2 byte.
Nhưng code của bạn:
Dim MyData(2) As Long <<< khai báo "as long" cho mỗi lần lấy nghĩa là 4 byte, 2 lần là 8 byte. Trong khi biến chứa kiểu Single là 4 byte.

Mình code lại như này, ko biết ổn ko, do ko rõ cái Address kia là tính theo 1 byte hay 2 byte, code mình sửa là mặc định theo code của bạn (2 byte).

Mã: Chọn hết

Declare Sub CopyMemory Lib "kernel32" alias "RtlMoveMemory" (dst as Any, src As Any, Byval numbytes As Long)

Dim MyData(1) As integer
Dim fValue As Single
For i = 0 To 1
   call MbMasterV71.ReadResults(hConnect, Slave_Address, Command, Address + i, MyData(i))
Next i
CopyMemory ByVal VarPtr(fValue), ByVal VarPtr(MyData(1)), 2
CopyMemory ByVal VarPtr(fValue) + 2, ByVal VarPtr(MyData(0)), 2
Triệu người quen có mấy người thân, khi lìa trần có mấy người đưa?
DK Cosmos


Quay về “Visual Basic 6 và Visual Basic Script (VB & VBS)”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.4 khách