Você está na página 1de 9

Usando o driver de comunicao para Unitronics. Net A nova. Unidade com net suporta PLCs viso e U90 PLCs.

Ele suporta atualmente trs formas / canais de comunicao com o PLC: O canal de srie Ethernet canal canal de escuta Ethernet Com os primeiros dois canais, o PLC a que abre a comunicao, e na terceira o PC ouve uma porta especfica e espera por um PLC para ligar. Quando voc quiser realizar uma ao em um PLC, voc sempre faz-lo usando um objeto de PLC. A fim de obter um objeto do PLC, voc precisa definir o caminho da primeira comunicao (Canal) e em seguida, usar o mtodo PLCFactory.GetPLC, a fim de obter um objeto PLC volta. Com ambos os 2 primeiros canais, voc ir receber um objeto do PLC, ou uma exceo se uma conexo no pde ser estabelecida com o PLC. No canal 3 (The Listener Ethernet) voc comea a ouvir uma porta e voc no pode prever quando o PLC vai chamar. por isso que os eventos esto sendo utilizados.

1. Canais de Comunicao 1.1. canal serial O canal serial tem vrios construtores. Sugerimos usando um dos dois:
Serial oSerial = new Serial(portName, baudRate, retry, timeOut, dataBits, parity, stopBit); OU Serial oSerial = new Serial(portName, baudRate, retry, timeOut, dataBits, parity, stopBit, autoDetectComParams);

Isso ocorre porque esses dois construtores cobrir a maior parte / todos os parmetros de comunicao necessrios. O tempo de espera (assim como com os outros canais) em milissegundos. Por ter um tempo limite de 3 segundo, voc precisa escrever 3000. No segundo construtor o ltimo argumento autoDetectComParams (o que verdade, por padro se voc usar outros construtores). Este argumento / propriedade vai deixar voc decidir se deseja que o canal serial para detectar auto e sincronizar as propriedades de comunicao (Boundrate, databits, etc) com o PLC. Por favor note que AutoDetect est desabilitado para RS485 (Qualquer ID de unidade com um valor de 64 a 127). Este um exemplo do cdigo de criar um canal serial:
Serial serial = new Serial(SerialPortNames.COM1,BaudRate.BR115200,3,3000, DataBits.DB8, System.IO.Ports.Parity.None,System.IO.Ports.StopBits.One);

1.2. canal Ethernet O canal Ethernet tem vrios construtores. Sugerimos usar este:
Ethernet ethernet = new Ethernet(string remoteIp, Int32 remotePort, EthProtocol protocolType, int retry, int TimeOut);

Este um exemplo do cdigo de criar um canal de Ethernet:


Ethernet ethernet = new Ethernet("192.168.1.100", 20256, EthProtocol.TCP, 3, 3000);

2. Conseguir um objeto PLC Para obter um objeto PLC voc precisa usar o mtodo PLCFactory.GetPLC. Este mtodo tem atualmente duas sobrecargas:
public static PLC GetPLC(Channel channel, int unitId); public static void GetPLC(EthernetListener ethernetListener);

A primeira sobrecarga aceita qualquer canal e um ID da unidade. Voc pode usar uma srie ou um Ethernet canal (E em EthernetListener casos especiais). A segunda sobrecarga, como voc provavelmente vai notar, no retorna um objeto PLC. Isto porque precisamos esperar o PLC para chamar a fim de obter um objeto PLC. Em uma canais seriais ou Ethernet vamos fazer algo como isto:
PLC plc = PLCFactory.GetPLC(serial, 0);

importante envolver o pedido GetPLC em um try + pegar uma vez que uma exceo ser lanada se o ComDrive no ser capaz de comunicar com o PLC. Sugerimos usar UnitID = 0 sempre que voc est indo para comunicar / executar aes no PLC, que conectado diretamente ao PC. Em um ouvinte Ethernet:
EthernetListener listener = PLCFactory.GetChannel(20256); if (listener == null) listener = new EthernetListener(20256, 3, 3000); listener.OnListenerConnectionAccepted += new EthernetListener.ListenerConnectionAcceptedDelegate(OnConnect); listener.OnListenerConnectionClosed += new EthernetListener.ListenerConnectionClosedDelegate(OnDisconnect); PLCFactory.GetPLC(listener);

Este exemplo "ouve" a porta 20256. Por favor note que primeiro voc vai para a PLCFactory e solicitar um ouvinte por porta. Isto porque a unidade Com contm uma lista de canais que esto em uso ou que estavam em uso por AppDomain atual. Se voc acabou de criar um ouvinte e, em seguida, adicionar o "OnConnect" e "OnDisconnect" para o evento, em seguida, h uma boa chance de que essas funes no sero chamados, porque o PLCFactory vai usar o canal EthernetListener na lista (e que adicionou os funo para eventos de um canal que no ser usado). Uma observao importante que o PLC tem no caso de o ouvinte o PLC em UnitID 0 (Conexo direta). H uma chance de que este o PLC que deseja "falar" com, e isso bom, mas o que se pretende "falar", por exemplo, com um PLC, que est ligado atravs de CANbus para o chamador (a PLC que chamou seu PC)? Esta uma das situaes especiais em que voc deve usar o GetPLC regular / Sincrnica funo.

Por exemplo:
private void OnConnect(PLC oPlc) { Ethernet listener = oPlc.PLCChannel; try { plc = PLCFactory.GetPLC(listener, 41); }c atch { System.Windows.Forms.MessageBox.Show("Could not communicate with the PLC"); } }

O OnListenerConnectionClosed ser levantado tudo o que voc chamar listener.Disconnect, plc.Disconnect ou o chamador fechar a ligao. O OnListenerConnectionAccepted ser gerado apenas se um objeto vlido PLC foi criado depois que algum chamou o PLC. Se voc fizer um telnet 127.0.0.1 20256 ento o evento no ser levantada desde o chamador no um PLC.

3. Usando o objeto do PLC Cada ao que voc deseja que o PLC para transportar deve ser feita por meio de um objeto PLC. Cada ao que voc executa em um objeto do PLC deve ser envolvido com + tentar pegar. Isto proporciona proteo contra erros ComDrive, algo que voc fez de errado no seu cdigo, ou no caso em que o PLC no responder (erro de comunicao, por exemplo). H vrias aes que podem ser executadas. Por exemplo: plc.Run (); plc.Stop (); plc.Reset (); plc.Init (); plc.Abort (); plc.Disconnect (); plc.ReadWrite (ref ReadWriteRequest []); propriedades: plc.Version plc.UnitId plc.RTC plc.PLCChannel Com o primeiro grupo de aes que voc pode Run/Stop/Rest/Init o PLC. O segundo grupo destinado a cancelar as aes que voc enviou para o PLC, ou para o fechamento do ligao. plc.Abort () no ir desfazer os comandos que voc enviou. Ela s vai evitar todos os comandos que no foram enviados para o PLC, para ser enviada. Voc vai ver que voc pode solicitar aes ReadWrite vrios do PLC que pode levar mais do que alguns segundos. Desde que voc pode envi-los de forma assncrona, ou criar um novo segmento e envi-lo, jog-lo, ento voc vai querer uma maneira de abortar. Chamando plc.Disconnect () (ou channel.Disconnect evento ()) no significa necessariamente que o canal vai fechar sua conexo. Este no um bug, mas na verdade feito de propsito. Considere uma das seguintes situaes: 1) Voc tem vrios tpicos ou solicitaes assncronas vrias vezes para o PLC, que foram feitas atravs do objeto PLC mesmo, e voc chamar plc.Disconnect (). 2) Existem vrios objetos PLC que usam o mesmo canal e cada um deles pedidos forma algo um PLC utilizando esse canal. Obviamente, desde que outros pedidos esto sendo feitos pelo mesmo canal, em seguida, fech-lo por 1 fio pode causar excees para os outros. O PLC ir fechar o canal s da fila do canal est vazio. Alm disso, se voc conseguiu fechar o canal e um ou mais objetos PLC enviar um pedido, o canal deve ser reaberto (se de srie ou Ethernet. Uma ouvinte no pode abrir uma conexo uma vez que no aquele que inicia a conexo). Trabalha de forma sncrona com 1 fio (GUI principal ou segmento de classe para que o assunto) e com uma PLC objeto ir certificar-se de que as ligaes ser fechada quando voc pedir para ele. Se voc pretende trabalhar com vrios segmentos ou objetos diversos PLC,

ento voc precisa ter certeza de que voc tenta fechar a conexo quando nada mais tentar usar o canal. Desde Abortando solicitaes no instantnea (A solicitao atual precisa ser anulada, o PLC precisa certificar-se de que o PLC terminado a responder, e que todas as solicitaes na fila foram removidas), ento plc.Abort () est sendo chamado de forma assncrona e quando abortar est sendo finalizado ento o seguinte Evento est sendo levantada:
Plc.EventAbortCompleted

(Portanto, certifique-se registrar para que o evento se voc precisar fazer algo no Concludo Abort) Por exemplo: Se voc quiser fechar o canal e enviar uma plc.Abort () para cada um dos objetos que o uso de PLC que canal. Desde o Disconnect no sero ignorados apenas se o canal no est ocupado ou envio espera de uma resposta, ento voc precisa se cadastrar no evento Abortar Concludo e somente se conseguir o evento gerado a partir de objetos usados PLC que esse canal, ento voc pode chamar o plc.Disconnect () Sobre as propriedades: plc.Version plc.UnitId plc.RTC plc.PLCChannel Essas propriedades esto sendo tomadas a partir do PLC. Isso significa que se voc escrever: System.Diagnostics.Debug.Print (plc.Version.OSVersion); Em seguida, o ComDrive enviar uma solicitao para o PLC e solicitar os parmetros de verso. Isso significa que se voc escrever: System.Diagnostics.Debug.Print (plc.Version.OSVersion); System.Diagnostics.Debug.Print (plc.Version.HWVersion); System.Diagnostics.Debug.Print (plc.Version.PLCModel); System.Diagnostics.Debug.Print (plc.Version.Boot); Ento voc vai fazer com que a unidade Com a enviar quatro "verso" pedidos para o PLC em vez de apenas Uma! No meu exemplo, voc pode ver a soluo certa:
PlcVersion version = plc.Version;

System.Diagnostics.Debug.Print(version.OSVersion); System.Diagnostics.Debug.Print(version.HWVersion); System.Diagnostics.Debug.Print(version.PLCModel); System.Diagnostics.Debug.Print(version.Boot);

Desta forma, apenas um pedido foi feito ao PLC. plc.RTC retornar a hora e a data do PLC em formato DateTime. Escrever o seguinte ir definir a data ea hora no PLC: plc.RTC = DateTime.Now; A mesma coisa se aplica ao UnitId. Ficando o seu valor ir retornar a UnitId do PLC, e definindo seu valor altera o UnitId do PLC.

4. Usando o PLC.ReadWrite Uma das boas caractersticas deste driver de comunicao que voc pode pedir um monte de solicitaes em uma chamada. O ComDrive vai lidar com elas separadamente, e ir dividir os dados enviar, se necessria (se os dados excede o tampo, por exemplo). Por exemplo, voc pode fazer isso:
Serial oSerial = new Serial(SerialPortNames.COM1, BaudRate.BR115200, 3, 3000, DataBits.DB8, System.IO.Ports.Parity.None, System.IO.Ports.StopBits.One); PLC oPLC; oPLC = PLCFactory.GetPLC(oSerial, 0); oPLC.SetExecuter(PLCExecuterType.ExecuterPartialBinaryMix); object[] values = new object[2048]; for (int i = 0; i < 2048; i++) { values[i] = (object)i; } ReadWriteRequest[] readwrite = new ReadWriteRequest[5]; readwrite[0] = new WriteOperands { NumberOfOperands = 2048, OperandType = OperandTypes.MI, StartAddress = 0, Values = values }; readwrite[1] = new ReadOperands { NumberOfOperands = 200, OperandType = OperandTypes.ML, StartAddress = 0, }; readwrite[2] = new ReadOperands { NumberOfOperands = 1024, OperandType = OperandTypes.MB, StartAddress = 0, }; readwrite[3] = new ReadDataTables { StartAddress = 0, NumberOfBytesToReadInRow = 12, NumberOfRowsToRead = 5, RowSizeInBytes = 4 }; readwrite[4] = new ReadOperands { NumberOfOperands = 64, OperandType = OperandTypes.DW, StartAddress = 0, }; try { oPLC.ReadWrite(ref readwrite); } catch { MessageBox.Show("Error"); }

Como voc pode ver, o cdigo envia apenas um pedido oPLC.ReadWrite. O pedido teve vrios sub requests em uma matriz. O cdigo permite tanto a leitura e escrita de e para operandos e tambm leitura e escrita de e para DataTables. NOTA: A ordem dos pedidos na matriz no pode ser a mesma ordem em que eles sero enviada para o PLC. Se a ordem importante, ento, enviar comandos plc.ReadWrite vrios. (Por exemplo, voc tem uma srie de WriteOperand e depois ReadOperand. Em alguns casos, a Leitura ser enviado antes da gravao). possvel preservar a ordem da seguinte forma: oPLC.ReadWrite(ref WriteOperandRequest); oPLC.ReadWrite(ref ReadOperandRequest);

Set / Get temporizador valores, d-lhe um "bnus". Para solicitar uma leitura de dois temporizadores:
readwrite[0] = new ReadOperands { NumberOfOperands = 2, OperandType = OperandTypes.TimerPreset,

Neste caso, existe uma outra propriedade no construtor que podem ser utilizados: TimerValueFormat Essa propriedade pode ser usada para definir o formato dos valores que voc enviar ou receber do PLC. O formato padro TimeFormat. Neste formato, cada valor do temporizador utiliza uma matriz de quatro campos, em que cada campo representa o "seo" no temporizador. Por exemplo: o valor do temporizador: "11:22:34.56" ser entregue como uma lista de ushort:

list[0] = 11 list [1] = 22 list [2] = 34 list [3] = 56

Você também pode gostar