Thanks for the reply, Chris.
1 Myhongk is ok, haha
2 It is my honor to be a regular contributor to open source projects.I'm
just worried if I'm up to the task.
3 Thanks for the detailed answer on BOOL type, I will try to fix this bug.
Let me confirm, 400006:BOOL[10], it means read the last 1-10 bits, right?
For example, 10101010 10101010, the read is 10 10101010, in the program
 like list[0,1,0,1,0,1,0,1,0,1]
Am I understanding correctly?
Also, please tell me where I can learn the define of BOOL[2] is getting the
last two bits of two registers

Christofer Dutz <[email protected]> 於 2022年4月22日 週五 下午4:30寫道:

> Hi Myhong (Hope that's correct)
>
> First of all, welcome to our cool project ... I hope you'll like it here
> and become a regular contributor ;-)
>
> Regarding BOOL[2] getting the last two bits of two registers is definitely
> not the way it should be. It should be returning the last two bits of one
> register and only span to the next if reading more than 8. We should
> probably track this in an issue and fix it (if you've already got an idea
> ... PRs are always welcome :-))
>
> However not 100% sure how we should generally do this. Perhaps [1] should
> return the first bit and add lesser significant bits as the array grows. I
> think I did it the way it's currently implemented, as when using registers
> to store Boolean values I usually store 0 and 1 in them.
>
> Other protocols (s7) have the concept of a bit-address. Perhaps
> artificially extending the modbus protocol with this concept would be an
> option.
>
> Taking your example:
>
> 400006.1:BOOL[2]
>
> Could then read two bits starting at the second-most significant bit.
>
> 0XX00000 00000000
>
> Would that work for you? But in that case we probably should invert how we
> read "BOOL" from interpreting:
>
> 00000000 000000001 as true to 10000000 00000000
>
> But not sure on how this would break other options.
>
> Chris
>
>
> -----Original Message-----
> From: 洪锦琳 <[email protected]>
> Sent: Freitag, 22. April 2022 10:16
> To: [email protected]
> Subject: Reads of type bool have different results
>
> Hello everyone!
> First, thanks to Chris for his reply in my PR, so here I am!
>
> Issue:
> 1 When I read 400006:BOOL[1], it will get the last bit of 400006(2bytes).
> Here is the source code:
>
> github.com/apache/plc4x/plc4go/internal/plc4go/modbus/readwrite/model/DataItem.go
>
> case dataType == ModbusDataType_BOOL && numberOfValues == uint16(1): //
> BOOL
>    // Reserved Field (Just skip the bytes)
>    if _, _err := readBuffer.ReadUint16("reserved", 15); _err != nil {
>       return nil, errors.Wrap(_err, "Error parsing reserved field")
>    }
>
>    // Simple Field (value)
>    value, _valueErr := readBuffer.ReadBit("value")
>    if _valueErr != nil {
>       return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
>    }
>    readBuffer.CloseContext("DataItem")
>    return values.NewPlcBOOL(value), nil
>
>
> 2 When I read 400006:BOOL[2], I get 400006 and 400007, the first two bits
> of a total of 4 bytes.
> Source code:
>
> github.com/apache/plc4x/plc4go/internal/plc4go/modbus/readwrite/model/DataItem.go
>
> case dataType == ModbusDataType_BOOL: // List
>    // Array Field (value)
>    var value []api.PlcValue
>    for i := 0; i < int(numberOfValues); i++ {
>       _item, _itemErr := readBuffer.ReadBit("value")
>       if _itemErr != nil {
>          return nil, errors.Wrap(_itemErr, "Error parsing 'value' field")
>       }
>       value = append(value, values.NewPlcBOOL(_item))
>    }
>    readBuffer.CloseContext("DataItem")
>    return values.NewPlcList(value), nil
>
> I thought it was 400006:BOOL[1] to get the 2nd bit of 400006, but the "[1]"
> match in the regular is "quantity". So, I'm not sure how to fix this
> problem correctly. Let's discuss it here.
> github.com/apache/plc4x/plc4go/internal/plc4go/modbus/FieldHandler.go
>
> generalFixedDigitAddressPattern :=
> `(?P<address>\d{4,5})?(:(?P<datatype>[a-zA-Z_]+))?(\[(?P<quantity>\d+)])?$`
>

Reply via email to