Skip to content

Commit

Permalink
refactor(plc4go/s7): cleanup s7 code
Browse files Browse the repository at this point in the history
  • Loading branch information
sruehl committed Jul 26, 2022
1 parent d2384a0 commit 955055a
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 89 deletions.
45 changes: 23 additions & 22 deletions plc4go/internal/s7/Connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,26 +184,26 @@ func (m *Connection) setupConnection(ch chan plc4go.PlcConnectionConnectResult)
if err := m.messageCodec.SendRequest(
m.createS7ConnectionRequest(cotpPacketConnectionResponse),
func(message spi.Message) bool {
tpktPacket := message.(readWriteModel.TPKTPacket)
if tpktPacket == nil {
tpktPacket, ok := message.(readWriteModel.TPKTPacketExactly)
if !ok {
return false
}
cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
if cotpPacketData == nil {
cotpPacketData, ok := tpktPacket.GetPayload().(readWriteModel.COTPPacketDataExactly)
if !ok {
return false
}
messageResponseData := readWriteModel.CastS7MessageResponseData(cotpPacketData.GetPayload())
if messageResponseData == nil {
messageResponseData, ok := cotpPacketData.GetPayload().(readWriteModel.S7MessageResponseDataExactly)
if !ok {
return false
}
parameterSetupCommunication := readWriteModel.CastS7ParameterSetupCommunication(messageResponseData.GetParameter())
return parameterSetupCommunication != nil
_, ok = messageResponseData.GetParameter().(readWriteModel.S7ParameterSetupCommunicationExactly)
return ok
},
func(message spi.Message) error {
tpktPacket := message.(readWriteModel.TPKTPacket)
cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
messageResponseData := readWriteModel.CastS7MessageResponseData(cotpPacketData.GetPayload())
setupCommunication := readWriteModel.CastS7ParameterSetupCommunication(messageResponseData.GetParameter())
cotpPacketData := tpktPacket.GetPayload().(readWriteModel.COTPPacketData)
messageResponseData := cotpPacketData.GetPayload().(readWriteModel.S7MessageResponseData)
setupCommunication := messageResponseData.GetParameter().(readWriteModel.S7ParameterSetupCommunication)
s7ConnectionResult <- setupCommunication
return nil
},
Expand Down Expand Up @@ -251,25 +251,26 @@ func (m *Connection) setupConnection(ch chan plc4go.PlcConnectionConnectResult)
if err := m.messageCodec.SendRequest(
m.createIdentifyRemoteMessage(),
func(message spi.Message) bool {
tpktPacket := readWriteModel.CastTPKTPacket(message)
if tpktPacket == nil {
tpktPacket, ok := message.(readWriteModel.TPKTPacketExactly)
if !ok {
return false
}
cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
if cotpPacketData == nil {
cotpPacketData, ok := tpktPacket.GetPayload().(readWriteModel.COTPPacketDataExactly)
if !ok {
return false
}
messageUserData := readWriteModel.CastS7MessageUserData(cotpPacketData.GetPayload())
if messageUserData == nil {
messageUserData, ok := cotpPacketData.GetPayload().(readWriteModel.S7MessageUserDataExactly)
if !ok {
return false
}
return readWriteModel.CastS7PayloadUserData(messageUserData.GetPayload()) != nil
_, ok = messageUserData.GetPayload().(readWriteModel.S7PayloadUserDataExactly)
return ok
},
func(message spi.Message) error {
tpktPacket := readWriteModel.CastTPKTPacket(message)
cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
messageUserData := readWriteModel.CastS7MessageUserData(cotpPacketData.GetPayload())
s7IdentificationResult <- readWriteModel.CastS7PayloadUserData(messageUserData.GetPayload())
tpktPacket := message.(readWriteModel.TPKTPacket)
cotpPacketData := tpktPacket.GetPayload().(readWriteModel.COTPPacketData)
messageUserData := cotpPacketData.GetPayload().(readWriteModel.S7MessageUserData)
s7IdentificationResult <- messageUserData.GetPayload().(readWriteModel.S7PayloadUserData)
return nil
},
func(err error) error {
Expand Down
53 changes: 23 additions & 30 deletions plc4go/internal/s7/Field.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,31 +23,31 @@ import (
"fmt"
"github.com/apache/plc4x/plc4go/internal/spi/utils"
"github.com/apache/plc4x/plc4go/pkg/api/model"
readWrite "github.com/apache/plc4x/plc4go/protocols/s7/readwrite/model"
"github.com/pkg/errors"
readWriteModel "github.com/apache/plc4x/plc4go/protocols/s7/readwrite/model"
)

type S7PlcField interface {
GetDataType() readWrite.TransportSize
type PlcField interface {
model.PlcField
GetDataType() readWriteModel.TransportSize
GetNumElements() uint16
GetBlockNumber() uint16
GetMemoryArea() readWrite.MemoryArea
GetMemoryArea() readWriteModel.MemoryArea
GetByteOffset() uint16
GetBitOffset() uint8
}

type PlcField struct {
type plcField struct {
FieldType FieldType
MemoryArea readWrite.MemoryArea
MemoryArea readWriteModel.MemoryArea
BlockNumber uint16
ByteOffset uint16
BitOffset uint8
NumElements uint16
Datatype readWrite.TransportSize
Datatype readWriteModel.TransportSize
}

func NewField(memoryArea readWrite.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, datatype readWrite.TransportSize) PlcField {
return PlcField{
func NewField(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, datatype readWriteModel.TransportSize) PlcField {
return plcField{
FieldType: S7Field,
MemoryArea: memoryArea,
BlockNumber: blockNumber,
Expand All @@ -59,13 +59,13 @@ func NewField(memoryArea readWrite.MemoryArea, blockNumber uint16, byteOffset ui
}

type PlcStringField struct {
PlcField
plcField
stringLength uint16
}

func NewStringField(memoryArea readWrite.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, stringLength uint16, datatype readWrite.TransportSize) PlcStringField {
func NewStringField(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, stringLength uint16, datatype readWriteModel.TransportSize) PlcStringField {
return PlcStringField{
PlcField: PlcField{
plcField: plcField{
FieldType: S7StringField,
MemoryArea: memoryArea,
BlockNumber: blockNumber,
Expand All @@ -78,51 +78,44 @@ func NewStringField(memoryArea readWrite.MemoryArea, blockNumber uint16, byteOff
}
}

func (m PlcField) GetAddressString() string {
func (m plcField) GetAddressString() string {
// TODO: add missing variables like memory area, block number, byte offset, bit offset
return fmt.Sprintf("%d:%s[%d]", m.FieldType, m.Datatype, m.NumElements)
}

func (m PlcField) GetTypeName() string {
func (m plcField) GetTypeName() string {
return m.Datatype.String()
}

func (m PlcField) GetDataType() readWrite.TransportSize {
func (m plcField) GetDataType() readWriteModel.TransportSize {
return m.Datatype
}

func (m PlcField) GetNumElements() uint16 {
func (m plcField) GetNumElements() uint16 {
return m.NumElements
}

func (m PlcField) GetBlockNumber() uint16 {
func (m plcField) GetBlockNumber() uint16 {
return m.BlockNumber
}

func (m PlcField) GetMemoryArea() readWrite.MemoryArea {
func (m plcField) GetMemoryArea() readWriteModel.MemoryArea {
return m.MemoryArea
}

func (m PlcField) GetByteOffset() uint16 {
func (m plcField) GetByteOffset() uint16 {
return m.ByteOffset
}

func (m PlcField) GetBitOffset() uint8 {
func (m plcField) GetBitOffset() uint8 {
return m.BitOffset
}

func (m PlcField) GetQuantity() uint16 {
func (m plcField) GetQuantity() uint16 {
return m.NumElements
}

func CastTos7FieldFromPlcField(plcField model.PlcField) (PlcField, error) {
if s7Field, ok := plcField.(PlcField); ok {
return s7Field, nil
}
return PlcField{}, errors.New("couldn't cast to s7PlcField")
}

func (m PlcField) Serialize(writeBuffer utils.WriteBuffer) error {
func (m plcField) Serialize(writeBuffer utils.WriteBuffer) error {
if err := writeBuffer.PushContext(m.FieldType.GetName()); err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion plc4go/internal/s7/MessageCodec.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
func (m *MessageCodec) Send(message spi.Message) error {
log.Trace().Msg("Sending message")
// Cast the message to the correct type of struct
tpktPacket := model.CastTPKTPacket(message)
tpktPacket := message.(model.TPKTPacketExactly)
// Serialize the request
wb := utils.NewWriteBufferByteBased()
err := tpktPacket.Serialize(wb)
Expand Down
16 changes: 8 additions & 8 deletions plc4go/internal/s7/Reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,12 +100,12 @@ func (m *Reader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequ
if err := m.messageCodec.SendRequest(
tpktPacket,
func(message spi.Message) bool {
tpktPacket := readWriteModel.CastTPKTPacket(message)
if tpktPacket == nil {
tpktPacket, ok := message.(readWriteModel.TPKTPacketExactly)
if !ok {
return false
}
cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
if cotpPacketData == nil {
cotpPacketData, ok := tpktPacket.GetPayload().(readWriteModel.COTPPacketDataExactly)
if !ok {
return false
}
payload := cotpPacketData.GetPayload()
Expand All @@ -117,8 +117,8 @@ func (m *Reader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequ
func(message spi.Message) error {
// Convert the response into an
log.Trace().Msg("convert response to ")
tpktPacket := readWriteModel.CastTPKTPacket(message)
cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
tpktPacket := message.(readWriteModel.TPKTPacket)
cotpPacketData := tpktPacket.GetPayload().(readWriteModel.COTPPacketData)
payload := cotpPacketData.GetPayload()
// Convert the s7 response into a PLC4X response
log.Trace().Msg("convert response to PLC4X response")
Expand Down Expand Up @@ -211,7 +211,7 @@ func (m *Reader) ToPlc4xReadResponse(response readWriteModel.S7Message, readRequ

payloadItems := payload.GetItems()
for i, fieldName := range readRequest.GetFieldNames() {
field := readRequest.GetField(fieldName).(S7PlcField)
field := readRequest.GetField(fieldName).(PlcField)
payloadItem := payloadItems[i]

responseCode := decodeResponseCode(payloadItem.GetReturnCode())
Expand All @@ -236,7 +236,7 @@ func (m *Reader) ToPlc4xReadResponse(response readWriteModel.S7Message, readRequ
// Currently we only support the S7 Any type of addresses. This helper simply converts the S7Field from PLC4X into
// S7Address objects.
func encodeS7Address(field model.PlcField) (readWriteModel.S7Address, error) {
s7Field, ok := field.(S7PlcField)
s7Field, ok := field.(PlcField)
if !ok {
return nil, errors.Errorf("Unsupported address type %t", field)
}
Expand Down
14 changes: 7 additions & 7 deletions plc4go/internal/s7/Writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,12 +103,12 @@ func (m Writer) Write(writeRequest model.PlcWriteRequest) <-chan model.PlcWriteR
if err := m.messageCodec.SendRequest(
tpktPacket,
func(message spi.Message) bool {
tpktPacket := readWriteModel.CastTPKTPacket(message)
if tpktPacket == nil {
tpktPacket, ok := message.(readWriteModel.TPKTPacketExactly)
if !ok {
return false
}
cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
if cotpPacketData == nil {
cotpPacketData, ok := tpktPacket.GetPayload().(readWriteModel.COTPPacketDataExactly)
if !ok {
return false
}
payload := cotpPacketData.GetPayload()
Expand All @@ -120,8 +120,8 @@ func (m Writer) Write(writeRequest model.PlcWriteRequest) <-chan model.PlcWriteR
func(message spi.Message) error {
// Convert the response into an
log.Trace().Msg("convert response to ")
tpktPacket := readWriteModel.CastTPKTPacket(message)
cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
tpktPacket := message.(readWriteModel.TPKTPacket)
cotpPacketData := tpktPacket.GetPayload().(readWriteModel.COTPPacketData)
payload := cotpPacketData.GetPayload()
// Convert the s7 response into a PLC4X response
log.Trace().Msg("convert response to PLC4X response")
Expand Down Expand Up @@ -225,7 +225,7 @@ func (m Writer) ToPlc4xWriteResponse(response readWriteModel.S7Message, writeReq
}

func serializePlcValue(field model.PlcField, plcValue values.PlcValue) (readWriteModel.S7VarPayloadDataItem, error) {
s7Field, ok := field.(S7PlcField)
s7Field, ok := field.(PlcField)
if !ok {
return nil, errors.Errorf("Unsupported address type %t", field)
}
Expand Down
12 changes: 2 additions & 10 deletions plc4go/internal/simulated/Reader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
package simulated

import (
s72 "github.com/apache/plc4x/plc4go/internal/s7"
s7 "github.com/apache/plc4x/plc4go/internal/s7"
model3 "github.com/apache/plc4x/plc4go/internal/spi/model"
values2 "github.com/apache/plc4x/plc4go/internal/spi/values"
"github.com/apache/plc4x/plc4go/pkg/api/model"
Expand Down Expand Up @@ -142,15 +142,7 @@ func TestReader_Read(t *testing.T) {
},
args: args{
fields: map[string]model.PlcField{
"test": s72.PlcField{
FieldType: s72.S7Field,
MemoryArea: model4.MemoryArea_DATA_BLOCKS,
BlockNumber: 1,
ByteOffset: 1,
BitOffset: 0,
NumElements: 1,
Datatype: model4.TransportSize_BOOL,
},
"test": s7.NewField(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL),
},
fieldNames: []string{"test"},
},
Expand Down
12 changes: 2 additions & 10 deletions plc4go/internal/simulated/Writer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
package simulated

import (
s72 "github.com/apache/plc4x/plc4go/internal/s7"
s7 "github.com/apache/plc4x/plc4go/internal/s7"
model3 "github.com/apache/plc4x/plc4go/internal/spi/model"
values2 "github.com/apache/plc4x/plc4go/internal/spi/values"
"github.com/apache/plc4x/plc4go/pkg/api/model"
Expand Down Expand Up @@ -151,15 +151,7 @@ func TestWriter_Write(t *testing.T) {
},
args: args{
fields: map[string]model.PlcField{
"test": s72.PlcField{
FieldType: s72.S7Field,
MemoryArea: model4.MemoryArea_DATA_BLOCKS,
BlockNumber: 1,
ByteOffset: 1,
BitOffset: 0,
NumElements: 1,
Datatype: model4.TransportSize_BOOL,
},
"test": s7.NewField(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL),
},
values: map[string]values.PlcValue{
"test": values2.NewPlcBOOL(false),
Expand Down
2 changes: 1 addition & 1 deletion plc4go/internal/spi/PlcFieldHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ package spi
import "github.com/apache/plc4x/plc4go/pkg/api/model"

type PlcFieldHandler interface {
// ParseQuery Parser function to parse query strings for a given driver and produce PlcField instances from that
// ParseQuery Parser function to parse query strings for a given driver and produce plcField instances from that
ParseQuery(query string) (model.PlcField, error)
}

0 comments on commit 955055a

Please sign in to comment.