Okay, thank you

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

> Hi Myhongk,
>
> Well, you're never alone and we're always there to help you. So no
> worries, you're not going to break anything.
>
> Right now initially it was the plan to read the 10 least significant bit's
> of the register in that case, but from the code it's reading the most
> significant ones (Which I'm still not 100% sure which should be the right
> thing to do). What's definitely not right, is that we're not consuming the
> unnecessary bits at the end. So, when consuming 10 bits, we definitely need
> to consume the remaining 6 bits or the parser will be out of sync. But I
> guess as we're currently only reading one item at a time, this is probably
> not an issue, but it's still not formally correct.
>
> I think first we need to decide which path to go ...
>
> I'll start a DISCUSS thread on this so the others can jump in.
>
> Chris
>
>
>
>
> -----Original Message-----
> From: jl hong <[email protected]>
> Sent: Freitag, 22. April 2022 11:37
> To: [email protected]
> Subject: Re: Reads of type bool have different results
>
> 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