Siemens S7

Conecte CLPs Siemens S7 por endereço, pelo S7comm, ou por nome da variável, pelo S7CommPlus: o campo Acesso, rack e slot, áreas de memória, endereçamento tipado por byte e bit, nomes de variáveis, as definições de HMI e os tipos de dado nativos.

Ver como Markdown

O driver Siemens S7 conversa com CLPs Siemens S7 por S7comm, o protocolo clássico do Step 7 transportado sobre ISO-on-TCP. Ele usa endereçamento absoluto (área de memória, número do bloco de dados, byte e bit), então funciona sem nenhuma exportação de símbolos do projeto de engenharia. Adicione um dispositivo sob o driver Siemens S7 no Connector e preencha os campos abaixo; o painel mostra só os campos que este protocolo usa.

Isso vale para o acesso Por endereço. Cada dispositivo escolhe o seu Acesso: Por endereço, como descrito acima, ou Por nome, pelo S7CommPlus, o protocolo que o TIA Portal e as HMIs da Siemens usam, em que cada tag indica a sua variável como o TIA Portal a escreve e a CPU diz o tipo dela.

Acesso

Aspecto Por endereço Por nome
Protocolo S7comm sobre ISO-on-TCP, porta 102 S7CommPlus sobre TLS 1.3 em ISO-on-TCP, porta 102
CPUs S7-300, S7-400, S7-1200, S7-1500 S7-1500 com firmware V2.9 ou mais novo, S7-1200 com firmware V4.5 ou mais novo, configurados no TIA Portal V17 ou mais novo
Campos do dispositivo Host ou IP, Bastidor / Slot Host ou IP, Usuário e Senha, os dois opcionais
O que uma tag indica Área, número do DB, byte e bit, e o tipo de dado O nome da variável, por exemplo GanterOpt.Real_; a CPU diz o tipo
Na CPU PUT/GET liberado e blocos de dados sem acesso otimizado (Preparar a CPU) Nada a mudar: blocos de dados otimizados são lidos e o PUT/GET não é necessário
Descobrir Nenhum As variáveis da CPU (Descoberta)

Um dispositivo criado agora nasce Por nome. Um dispositivo salvo antes de a escolha existir continua lendo Por endereço, como sempre leu. Trocar o acesso mantém tanto os endereços tipados das tags quanto os nomes das variáveis, então voltar encontra tudo onde estava. Por nome, o cabeçalho do dispositivo mostra o endpoint sem rack e slot, por exemplo s7://192.168.0.2?access=name. Uma CPU que não responde ao acesso por nome diz isso na página do dispositivo (Uma CPU sem o acesso por nome).

Conexão

Campo Significado Padrão
Host ou IP Endereço IP ou nome de host da CPU (ou do módulo CP que fica na frente dela). vazio
Acesso Por endereço ou Por nome (Acesso). Por nome
Bastidor / Slot Só por endereço. Os números de rack e slot da CPU, como configurados no layout de hardware da Siemens. Duas caixas numéricas numa linha: rack primeiro, slot depois. 0 / 0
Usuário / Senha Só por nome, os dois opcionais: a senha da proteção da CPU, quando o nível de acesso dela pede uma, e um nome de usuário só para uma CPU que mantém usuários. Guardados protegidos neste computador. vazio
Intervalo de leitura (ms) Período de leitura de todo o dispositivo, para as tags que não o sobrepõem. 1.000

A porta TCP é fixa em 102 (ISO-on-TCP), então não há campo de porta. O cabeçalho do dispositivo mostra o endpoint montado, por exemplo s7://192.168.0.2:0:1 (host, rack, slot).

Rack e slot precisam bater com o hardware: CPUs S7-1200 e S7-1500 respondem no rack 0, slot 0 ou 1; uma CPU S7-300 típica fica no rack 0, slot 2; os racks do S7-400 variam com o layout. Um slot errado faz a conexão falhar, em vez de ler dados errados.

Cada tag pode definir o próprio Intervalo de leitura (ms); um valor 0 na tag recai no intervalo do dispositivo.

Ler por nome

Uma tag de um dispositivo lido por nome indica a sua variável na caixa Nome da variável do cartão Origem, como o TIA Portal a escreve: o bloco de dados e a variável, um ponto antes de um membro, um elemento de vetor entre colchetes. As aspas duplas do TIA Portal podem ser digitadas ("GanterOpt".Real_) e são descartadas.

Variável no TIA Portal Nome da variável
Real_ no bloco de dados GanterOpt GanterOpt.Real_
Valor da instância de UDT Udt_ GanterOpt.Udt_.Valor
Elemento 0 do vetor Vetor GanterOpt.Vetor[0]
O DTL DataHora GanterOpt.DataHora: uma tag só, uma data e hora

Não há área, número de bloco de dados nem byte a digitar: a CPU diz onde a variável está e o tipo dela, e o driver a lê no tipo de dado da tag:

Tipo na CPU Tipo de dado Nota
Bool Boolean
Byte, USInt; SInt Byte; SByte Sem sinal; com sinal
Word, UInt; Int UInt16; Int16 Sem sinal; com sinal
DWord, UDInt; DInt UInt32; Int32 Sem sinal; com sinal
LWord, ULInt; LInt UInt64; Int64 Os 64 bits, exatos
Real; LReal Float; Double
Char, String String Windows-1252, como por endereço
WChar, WString String UTF-16, qualquer escrita
Time, S5Time Int32 Milissegundos
LTime Int64 Nanossegundos
Time_Of_Day UInt32 Milissegundos desde a meia-noite, abaixo de 24 h
Date, Date_And_Time, DTL, LDT DateTime Só a data; data e hora

O Descobrir dá a cada tag o tipo de dado e a unidade (ms, ns) da variável dela. Uma tag digitada à mão fica com o tipo de dado que você escolher, e o valor da CPU é convertido para ele.

Uma String ou uma WString é escrita inteira, com o tamanho com que está declarada no bloco, que o driver lê da variável antes da primeira escrita: um texto mais longo é recusado com os dois tamanhos e nada é enviado, e uma String recusa um caractere fora do Windows-1252. Um DTL é lido e escrito inteiro, como uma data e hora; os oito campos dele nunca são oferecidos sozinhos, porque um campo escrito sozinho aceita qualquer valor (mês 90 inclusive). Um valor fora da faixa do tipo (um Time_Of_Day de 24 h ou mais, 40000 num Int) é recusado com a faixa, e nada é enviado. Um nome que a CPU não tem é o erro da tag, dizendo isso; um campo de um DTL indicado sozinho é orientado a indicar o DTL.

As definições de HMI

O TIA Portal guarda três definições para cada variável de um bloco de dados, nas colunas do bloco. A estação as respeita como a HMI e o servidor OPC UA da própria Siemens, seja o que for que a CPU deixe passar:

Definição no TIA Portal Quando está desmarcada
Accessible from HMI/OPC UA/Web API A variável não é lida nem escrita: o erro da tag nomeia a definição, e o Descobrir a deixa de fora.
Visible in HMI engineering O Descobrir deixa a variável de fora; uma tag que a indica à mão a lê normalmente.
Writable from HMI/OPC UA/Web API A variável é somente leitura: uma escrita é recusada nomeando a definição, o Acesso da tag oferece Somente leitura e diz por quê, e o Descobrir a oferece como Somente leitura.

Uma CPU sem o acesso por nome

Uma CPU que aceita a conexão e não responde ao acesso por nome (um S7-1500 antes do firmware V2.9, um S7-1200 antes do V4.5, um projeto configurado num TIA Portal anterior ao V17, ou uma CPU que só fala S7comm) deixa o dispositivo offline. A página do dispositivo diz isso num aviso no lugar do erro: o que a CPU precisa, onde o TIA Portal mostra o firmware (o firmware que a CPU roda em Online & diagnostics, a versão que o projeto indica nas propriedades da CPU em General > Catalog information) e as três saídas:

  1. Atualizar o firmware da CPU, colocar a mesma versão na CPU do projeto do TIA Portal e fazer o download da configuração de hardware. Atualizar só o firmware não basta.
  2. Mudar o Acesso para Por endereço, com o PUT/GET liberado e blocos de dados sem acesso otimizado (Preparar a CPU).
  3. Ler a CPU pelo servidor OPC UA dela mesma (um S7-1500, ou um S7-1200 a partir do firmware V4.4) com o driver OPC UA.

Cada tag do dispositivo traz o mesmo aviso na própria página, e o aviso some sozinho assim que a CPU responde por nome. O diário e o agente leem os mesmos passos no erro do dispositivo.

Preparar a CPU

Esta seção vale para o acesso por endereço; um dispositivo lido por nome não precisa de nenhuma destas definições.

Um S7-1200 ou S7-1500 só atende o endereçamento absoluto do S7comm com duas definições dele mesmo, as duas feitas no TIA Portal e baixadas para a CPU. Um S7-300 ou S7-400 não precisa de nenhuma.

Definição Onde no TIA Portal Sem ela
Permit access with PUT/GET communication from remote partner, marcada Abra a configuração de dispositivos da CPU, selecione a CPU e então Properties > General > Protection & Security > Connection mechanisms. Baixe a configuração de hardware (Download to device > Hardware configuration): um download só do programa não a leva. A CPU aceita a conexão e recusa toda leitura e escrita. O dispositivo segue conectado e as tags dele leem qualidade ruim.
Optimized block access, desmarcada, em todo bloco de dados que a estação lê Na árvore do projeto, em Program blocks, clique com o botão direito no bloco de dados e então Properties > General > Attributes. Compile o bloco e baixe-o. A coluna Offset do bloco passa a mostrar onde cada variável começa, que é o que o Byte inicial de uma tag recebe. A CPU não entrega nenhum byte do bloco por endereço. As tags dele leem qualidade ruim, e as outras tags do dispositivo seguem lendo.

Mudar Optimized block access reinicializa o bloco de dados no download: as variáveis voltam aos valores iniciais. A memória de marcadores (M), as entradas (I) e as saídas (Q) sempre são endereçáveis e não precisam de mudança. Um bloco de dados que precisa continuar otimizado pode ser lido de outro jeito: o programa do CLP copia os valores que a estação lê para um bloco de dados sem acesso otimizado, ou para a memória de marcadores, e as tags apontam para lá; ou a estação lê o CLP pelo servidor OPC UA dele mesmo (S7-1500; S7-1200 a partir do firmware 4.4) com o driver OPC UA.

Quando a CPU recusa por causa de uma das duas definições, a página do dispositivo diz qual, com estes passos, num aviso que some sozinho assim que a CPU aceita. Para um bloco de dados, ele nomeia o bloco e as tags que ficam sem leitura. O diário e o agente leem os mesmos passos. Um bloco de dados que a CPU não tem, e um endereço além do fim de um bloco de dados, são ditos como o que são na tag que os nomeia.

Endereçamento

Esta seção e as duas seguintes (tipos de dado, escritas) valem para o acesso por endereço; o acesso por nome está em Ler por nome.

Uma tag S7 é endereçada por campos tipados, não por uma cadeia de texto livre. O painel os mostra no cartão Origem da tag:

Campo Significado Valores aceitos Padrão
Área A área de memória a ler. DataBlock, Merker, ProcessInput, ProcessOutput, Timer, Counter DataBlock
Número do DB Qual bloco de dados, mostrado só quando a Área é DataBlock. 0 ou mais 1
Byte inicial Deslocamento de byte dentro da área em que o valor começa. Nas áreas Timer e Counter a caixa é rotulada Número do temporizador ou Número do contador e pede o número do timer ou do contador em vez do byte. 0 ou mais 0
Bit (0 a 7) Posição do bit dentro do byte inicial. Mostrado só em tags booleanas. 0–7 0
Comprimento máximo (vazio = 254) Máximo declarado de um STRING ou WSTRING do S7, em caracteres. Mostrado só em tags String fora das áreas Timer e Counter. 1–254 num STRING, 1–16382 num WSTRING, em branco em branco
Tipo do texto no CLP O tipo com que o texto é declarado no bloco, ao lado do comprimento: STRING (um byte por caractere, Windows-1252) ou WSTRING (dois bytes por caractere, UTF-16, qualquer escrita). Mostrado onde o Comprimento máximo aparece. STRING, WSTRING STRING

As áreas correspondem à notação Siemens de sempre: Merker é a memória de marcadores (M), ProcessInput são as entradas da imagem de processo (I/E), ProcessOutput são as saídas da imagem de processo (Q/A), e Timer/Counter são as áreas de timer e contador das CPUs S7-300 e S7-400. Timers e contadores são endereçados por número, não por byte: Timer com o número 5 lê T5, e Counter com o número 3 lê C3. Traduzindo endereços absolutos clássicos:

Endereço clássico Tipo de dado Campos a preencher
DB5.DBD12 guardando um REAL Float Área DataBlock, Número do DB 5, Byte inicial 12
DB1.DBX3.4 Boolean Área DataBlock, Número do DB 1, Byte inicial 3, Bit 4
DB2.DBW20 guardando um INT Int16 Área DataBlock, Número do DB 2, Byte inicial 20
MW10 Int16 Área Merker, Byte inicial 10
M10.3 Boolean Área Merker, Byte inicial 10, Bit 3
IB2 Byte Área ProcessInput, Byte inicial 2
Q4.1 Boolean Área ProcessOutput, Byte inicial 4, Bit 1
T5 Int16 Área Timer, Número do timer 5
C3 Int16 Área Counter, Número do counter 3

Uma tag booleana lê e escreve exatamente um bit no barramento; ela nunca reescreve o byte ao redor. Todo outro tipo é endereçado por byte, no byte inicial, com a largura exata do seu tipo de dado. A linha somente leitura Endereço de origem (barramento) do cartão Origem mostra o endereço montado enquanto você edita.

Tipos de dado

O Tipo de dado da tag decide o tipo nativo do S7 no barramento. As treze larguras nativas do S7 estão disponíveis:

Tipo de dado Tipo S7 Tamanho no barramento
Boolean BOOL 1 bit
SByte SINT 1 byte
Byte USINT 1 byte
Int16 INT 2 bytes
UInt16 UINT 2 bytes
Int32 DINT 4 bytes
UInt32 UDINT 4 bytes
Int64 LINT 8 bytes
UInt64 ULINT 8 bytes
Float REAL 4 bytes
Double LREAL 8 bytes
String STRING ou WSTRING comprimento máximo + 2 bytes (STRING), comprimento máximo × 2 + 4 bytes (WSTRING)
DateTime DTL 12 bytes

Valores de vários bytes usam automaticamente a ordem big-endian nativa do S7; não existe opção de ordem de bytes porque nenhuma é necessária.

Uma tag String lê o layout STRING padrão do S7: um byte com o máximo declarado, um byte com o comprimento atual e então os caracteres, um byte cada um em Windows-1252, a página de código em que o TIA Portal e as IHMs Siemens mostram um STRING. O que a estação escreve é o que o TIA Portal e a IHM mostram ("Peça 12" continua "Peça 12"), e a estação lê de volta igual. O Comprimento máximo conta caracteres e precisa bater com a declaração do STRING no bloco (em branco significa o máximo do S7, de 254); o driver transfere comprimento máximo + 2 bytes por leitura. Uma tag DateTime corresponde à estrutura DTL da família S7-1200/1500 (do ano até os nanossegundos); o DATE_AND_TIME antigo, de 8 bytes, não é oferecido.

Uma tag String cujo Tipo do texto no CLP é WSTRING lê no lugar dele o layout WSTRING do S7: uma palavra com o máximo declarado, uma palavra com o comprimento atual e então os caracteres, dois bytes cada um em UTF-16, então comporta qualquer escrita ("中" é escrito e lido de volta como "中"). O Comprimento máximo continua contando caracteres, de 1 a 16382, e precisa bater com a declaração WString no bloco (em branco significa 254, o comprimento que o TIA Portal dá a um WString declarado sem nenhum); o driver transfere comprimento máximo × 2 + 4 bytes por leitura. O S7comm não lê o tipo na CPU, então ele precisa bater com a variável: uma tag deixada em STRING diante de uma variável WString lê e escreve no layout errado. Toda tag salva antes de o campo existir é STRING.

Escritas

Tags cujo Acesso é Leitura e escrita ou Somente escrita podem ser escritas. As escritas endereçam a mesma área, o mesmo byte e o mesmo bit das leituras: uma escrita booleana liga o bit dela sozinho, e todo o resto escreve os bytes exatos do tipo. Uma tag nova nasce como Somente leitura.

Uma escrita String que ocupa mais bytes que o Comprimento máximo é recusada e nada é enviado, nunca cortada no tamanho: o diário e o agente leem, por exemplo, "The DB1 byte 44 write was not sent: the text takes 21 bytes, and the STRING holds 20." Um texto com exatamente o Comprimento máximo é escrito inteiro.

Uma escrita String com um caractere fora do Windows-1252 (um caractere chinês, por exemplo) é recusada do mesmo jeito, nunca escrita com um ponto de interrogação no lugar dele: o diário e o agente leem, por exemplo, "The DB1 byte 44 write was not sent: the STRING holds Windows-1252 characters only, and '中' (U+4E2D) is not one of them; it fits once the tag's text type in the PLC and the PLC variable are both WSTRING." O painel da tag diz o mesmo motivo no idioma da estação.

Para escrever um texto assim, declare a variável como WString no bloco e escolha WSTRING no Tipo do texto no CLP da tag. Um WSTRING conta dois bytes por caractere, então um texto mais longo que o Comprimento máximo dele é recusado do mesmo jeito, sem nada enviado: "The DB1 byte 94 write was not sent: the text takes 42 bytes, and the WSTRING holds 40 (20 characters of two bytes)."

Descoberta

Uma CPU lida por nome lista as suas variáveis; o S7comm não lista nenhuma, e nenhuma difusão encontra uma CPU. Na página do driver, CPU a varrer no cartão Escopo da varredura diz qual CPU: um dispositivo Siemens do driver que lê a sua CPU por nome, varrido no host desse dispositivo e entrando com a senha dele (o jeito de uma CPU protegida por senha listar as suas variáveis), ou Um endereço digitado aqui, com o endereço da CPU em Endereço da CPU.

Descobrir oferece a CPU como um dispositivo com as variáveis como tags: as que a CPU marca como acessíveis e visíveis pela HMI, todas marcadas, com o tipo que a CPU diz, e Somente leitura onde a CPU as marca como não graváveis pela HMI. A lista é uma árvore pelo caminho de cada nome: o bloco de dados, depois cada struct ou instância de UDT e cada array, depois as variáveis, cada uma nomeada pelo menor final do nome que nenhuma outra variável divide (Real_, Valor, Vetor[0]). Marcar um ramo marca ou desmarca tudo o que está abaixo dele, e o ramo diz quantas das suas variáveis estão marcadas; um DTL é uma variável só. Acrescentar dispositivo cria um dispositivo lido por nome com as tags marcadas.

Uma CPU que um dispositivo Siemens desta estação já lê por nome é esse dispositivo, como quer que a varredura a tenha nomeado: a varredura entra com a senha desse dispositivo, e Acrescentar tags acrescenta as variáveis para as quais ele ainda não tem tag. Na página de um dispositivo lido por nome, o Descobrir tags do cartão Tags faz o mesmo só para ele, com a mesma árvore (veja Descoberta). Um dispositivo lido por endereço não oferece Descobrir tags: acrescente as tags à mão.

Bom saber

  • As áreas Timer e Counter só existem nas CPUs S7-300 e S7-400. O S7-1200 não tem essas áreas, e o S7-1500 as recusa pelo S7comm com "Address out of range" mesmo com o PUT/GET permitido; nesse caso, copie o valor do timer ou do contador para um bloco de dados ou para a memória de marcadores no programa do CLP e leia de lá. Onde as áreas existem, elas são endereçadas por número, não por deslocamento de byte: a caixa pede o próprio timer ou contador (T0, T1, T2 e C0, C1, C2). Cada valor é uma palavra de 16 bits, então combine-o com Int16; um tipo de dado mais largo ou mais estreito é recusado, com a tag nomeada no diário, e as outras tags do dispositivo seguem lendo.
  • Um CLP inalcançável não custa nada na inicialização: o dispositivo segue tentando em segundo plano e as tags dele leem qualidade ruim até a conexão acontecer.
  • Um cabo puxado depois de o dispositivo estar online é percebido na próxima leitura: o dispositivo fica offline, as tags dele viram qualidade ruim, e ele reconecta sozinho assim que a rede volta. Um endereço que a CPU recusa não faz isso, então uma tag digitada errada nunca derruba o resto do dispositivo junto. A tag cuja leitura encontrou o enlace caído diz que a conexão com o dispositivo foi perdida, na língua da estação, e a página Eventos guarda as palavras do Sharp7.