Я пытаюсь связаться с ПЛК, который принимает / отправляет 16-битные значения, причем каждый отдельный бит позволяет выполнять проверку или нет.
Для этого я пыталсяиспользовать .Net BitArray, но результаты были далеко не успешными.
Структура подложки состоит из массива из двух байтов, оба байта инициализируются значением 0.
Когда ясоздать новый битрейр, используя один из этих байтов, я ожидал получить массив с 8 значениями, установленными в false. Это не так .
При байтовом значении 0 длина и количество битрейров также равны нулю.Хотя я мог предположить, что ведущие нули отбрасываются, это кажется очень нелогичным.
Когда я создаю битовый массив, используя байт со значением 200, я ожидал получить массив с 8 значениями ( True,Правда, Ложь, Ложь, Правда, Ложь, Ложь, Ложь ).Однако вместо этого я получаю битовый массив с длиной и счетом 200 ?
Код в настоящее время такой:
Private FaultBits as Byte = 0
Public Sub SetBitValue(index As Integer, value As Boolean)
Try
If index < 0 Then
Throw New Exception("Index is below zero!")
End If
If index > 7 Then
Throw New Exception("Index out of bounds! Maximum allowed index value is 7")
End If
'If BitConverter.IsLittleEndian Then
'ToDo
'End If
Dim bitArray_Section As BitArray = Nothing
bitArray_Section = New BitArray(FaultBits)
'bitArray_Section.Length = 8 'Truncates incorrectly
bitArray_Section.Item(index) = value 'Set the individual bit
FaultBits = ConvertToByte(bitArray_Section) 'Set back to byte
Catch ex As Exception
Throw New Exception("clsFaultBits : SetBitValue : w. Index " & index & " : Exception : " & ex.Message())
End Try
End Sub
И эквивалент get:
Public Function GetBitValue(index As Integer) As Boolean
Try
If index < 0 Then
Throw New Exception("Index is below zero!")
End If
If index > 7 Then
Throw New Exception("Index out of bounds! Maximum allowed index value is 7")
End If
Dim bitArray_Section As BitArray = Nothing
bitArray_Section = New BitArray(FaultBits)
'bitArray_Section.Length = 8
Return bitArray_Section.Item(index)
Catch ex As Exception
Throw New Exception("clsFaultBits : GetBitValue : w. Index " & index & " : Exception : " & ex.Message())
End Try
End Function
Функция преобразования, я предполагал, что она будет иметь длину 8, что неверно:
Public Function ConvertToByte(bits As BitArray) As Byte
Try
If bits.Count <> 8 Then
Throw New Exception("Invalid amount of bits!")
End If
Dim returnbyte(1) As Byte
bits.CopyTo(returnbyte, 0)
Return returnbyte(0)
Catch ex As Exception
Throw New Exception("clsFaultBits : ConvertToByte : Exception : " & ex.Message())
End Try
End Function
ByteValue :: BitarrayLength / Count
0 ::0/0
200 :: 200/200
10 :: 10/10
Чего я хотел бы достичь:
Получить байт (1-0-0-1-0-0-1-0)
Включить логические значения в программе, читая отдельные биты: Check1, Check4, Check7
Установите отдельные биты выходного байта, начиная с 0-0-0-0-0-0-0-0
Включите 5: 0-0-0-0-1-0-0-0
Включите 2: 0-1-0-0-1-0-0-0
Байт отправки
Полностью ли я неправильно использую класс BitArray?Что я делаю неправильно?Что позволило бы мне изменять отдельные битовые значения, не сталкиваясь с этим хаосом?
Почему длина / количество битовых массивов совпадает со значением байта, а не с количеством битов, из которых состоит байт?
Я знаю, что код еще должен учитывать порядок байтов.
Заранее спасибо,
РЕШЕНО:
Я не сделалпонимать, что отправка байта, не являющегося массивом, в BitArray неявно приведёт его к целому числу и, следовательно, создаст BitArray, у которого длина / число равно значению байт .Что теперь имеет смысл.
Это также заставило меня осознать, что предупреждение моего компилятора о неявном приведении не срабатывает, поскольку Byte to Integer не считается неявным, поскольку я обычно получаю уведомление всякий раз, когда происходит неявное приведение.*
Спасибо за помощь!