Uma biblioteca de protocolo Mewtocol fácil de usar para fazer interface com PLCs Panasonic via TCP/Serial.
️ Esta biblioteca não é um produto oficial da Panasonic nem fornece suporte financeiro ou limitações de qualquer forma.
️ O FP7 não é atualmente suportado
Esta biblioteca foi testada apenas com alguns PLCs, outros tipos que suportam o protocolo Panasonic Mewtocol podem funcionar. Use por sua própria conta e risco, outros podem seguir com feedback da comunidade
Esta biblioteca foi escrita em netstandard2.0 e deve ser compatível com vários ambientes .NET.
Para obter uma lista completa de clrs .NET suportados, consulte esta página
Use a CLI dotnet e execute
dotnet add package Mewtocol.NET
A Panasonic publicou uma definição de protocolo em seu site. Consulte este site se quiser ver a funcionalidade geral ou adicionar/relatar recursos ausentes.
No momento, esta biblioteca não está completa com recursos, mas todos os recursos essenciais são fornecidos
Para ver uma lista completa de exemplos clique aqui.
Conectar-se a um PLC é tão simples quanto
using MewtocolNet ;
using ( var plc = Mewtocol . Ethernet ( "192.168.178.55" ) . Build ( ) ) {
await plc . ConnectAsync ( ) ;
if ( ! plc . IsConnected ) {
Console . WriteLine ( "Failed to connect to the plc..." ) ;
} else {
Console . WriteLine ( plc . PlcInfo ) ;
}
}
Instruções detalhadas
RegisterCollection
using MewtocolNet ;
using MewtocolNet . RegisterAttributes ;
public class TestRegisters : RegisterCollection {
//corresponds to a R100 boolean register in the PLC
[ Register ( "R100" ) ]
public bool TestBool1 { get ; private set ; }
//corresponds to a XD input of the PLC
[ Register ( "XD" ) ]
public bool TestBoolInputXD { get ; private set ; }
//corresponds to a DDT7012 - DDT7013 as a 32bit time value that gets parsed as a timespan (TIME)
//the smallest value to communicate to the PLC is 10ms
[ Register ( "DDT7012" ) ]
public TimeSpan TestTime { get ; private set ; }
//corresponds to a DT1101 - DT1104 string register in the PLC with (STRING[4])
[ Register ( "DT1101" , "STRING[4]" ) ]
public string TestString1 { get ; private set ; }
}
.WithPoller()
após o anexo do registro TestRegisters registers = null ;
//setting up a new PLC serial interface and tell it to use the register collection
var plc = Mewtocol . Serial ( "COM4" , BaudRate . _19200 )
. WithPoller ( )
. WithRegisterCollections ( c => {
registers = c . AddCollection < TestRegisters > ( ) ;
// or use
// c.AddCollection(new TestRegisters());
// if you want to pass data to a constructor
} )
. Build ( ) ;
//connect to it
await plc . ConnectAsync ( async ( ) => {
//restart the plc program during the connection process
await plc . RestartProgramAsync ( ) ;
} ) ;
//wait for the first data cycle of the poller module
//otherwise the property value might still be unset or null
await App . ViewModel . Plc . AwaitFirstDataCycleAsync ( ) ;
if ( App . ViewModel . Plc . IsConnected ) {
Console . WriteLine ( registers . TestBool1 ) ;
}
Observação! esta não é sua única opção para ler registros, veja aqui
Além da vinculação automática de propriedades, você pode usar estes padrões:
await plc . Register . Struct < short > ( "DT100" ) . WriteAsync ( 100 ) ;
var value = await plc . Register . Struct < short > ( "DT100" ) . ReadAsync ( ) ;
IRegister < bool > outputContactReference ;
var plc = Mewtocol . Ethernet ( "127.0.0.1" )
. WithRegisters ( b => {
b . Bool ( "Y4" ) . Build ( out outputContactReference ) ;
} )
. Build ( ) ;
await plc . ConnectAsync ( ) ;
await outputContactReference . WriteAsync ( true ) ;