=== INFORMACE O SYSTÉMU ===
Řada CPM: 100 CP1000K, fw v10.9, vs2.8
Překladač: xPRO Profi
Mosaic: aktuální verze
IP adresa PLC (ETH1): 192.168.2.AAA / maska 255.255.255.0 / brána 192.168.2.1
DNS server: 1.1.1.1 (ověřeno GetDNS_IP())
ETH1 režim: uni (potvrzeno v Konfigurátoru HW)
=== POPIS PROBLÉMU ===
PLC nedokáže navázat ŽÁDNÉ odchozí TCP spojení (uni kanál v režimu TCP master), ani na zařízení v lokální síti, ani na jiný cíl ve stejné síti (testováno včetně PC přímo vedle PLC, stejný switch/VLAN). Žádná explicitní chyba se nehlásí - spojení prostě nikdy nenaskočí.
Jako TCP SERVER PLC funguje normálně - příchozí spojení (Mosaic online režim na portu 61682, WebMaker, TecoAPI) fungují bez problémů a dlouhodobě stabilně.
=== KONFIGURACE TESTOVANÉHO KANÁLU ===
ETH1_uni (I/O Configurator): Protokol: TCP master
Velikost přijímací zóny: 512
Velikost vysílací zóny: 512
Vzdálená IP adresa: 0.0.0.0 (nastavuje se za běhu programu)
Vzdálený port: 80
Místní port: 0
=== TESTOVACÍ KÓD (zjednodušeno, ST) ===
VAR
testConnect : BOOL;
testIsCon : BOOL;
testErr : USINT;
testUniStat : TUni_STAT;
testRemoteAdr : TRemoteEthAdr;
testSetAdrDone : BOOL;
testTargetIp : STRING[15] := '192.168.2.BBB';
testTargetPort : UINT := 80;
END_VAR
IF testConnect AND NOT testSetAdrDone THEN
testRemoteAdr.remoteIP := STRING_TO_IPADR(testTargetIp);
testRemoteAdr.remotePort := testTargetPort;
testRemoteAdr.localPort := 0;
testSetAdrDone := SetRemoteIPaddress(rq := TRUE, chanCode := ETH1_uni,
ethAdr := testRemoteAdr);
END_IF;
IF testConnect AND testSetAdrDone AND NOT testIsCon THEN
testErr := EstabTCPconnection(chanCode := ETH1_uni);
END_IF;
testIsCon := IsEstabTCPconnection(chanCode := ETH1_uni);
IF NOT testConnect THEN
CloseTCPconnection(chanCode := ETH1_uni);
testSetAdrDone := FALSE;
END_IF;
testUniStat := GetChanStat(chanCode := ETH1_uni);
=== VÝSLEDKY TESTŮ ===
1) fbHttpRequest (InternetLib) na testovaný kanál → lokální HTTP server v síti (funkčnost cíle ověřena přímo z PC ve stejné síti přes curl): Zůstává trvale ve stavu hs_HttpConnect, errorTxt = 'HTTP request error : 1'.
2) fbOpenWeatherMap (jiný uni kanál) → internetový server, platný API klíč: identická chyba 'HTTP request error : 1'.
3) Holý test SetRemoteIPaddress() + EstabTCPconnection() + IsEstabTCPconnection() (viz kód výše): SetRemoteIPaddress vrací TRUE (adresa se úspěšně nastaví), EstabTCPconnection vrací COM_OK (0, žádná chyba), ale IsEstabTCPconnection zůstává trvale FALSE i po 15-20+ sekundách, opakovaně.
4) GetChanStat(chanCode) → TUni_STAT: všechna pole (TRO, RCF, ROV, TRF, ARC, CTS, DSR) zůstávají nulová po celou dobu pokusu o spojení.
5) tcpdump zachycení na cílovém počítači (PC/Mac ve stejné síti/VLAN jako PLC), filtr '(arp and host 192.168.2.AAA) or (host 192.168.2.AAA and port 8080)':
15:18:24.642329 ARP, Request who-has 192.168.2.BBB tell 192.168.2.AAA
15:18:24.642357 ARP, Reply 192.168.2.BBB is-at 06:86:3e:8a:06:34
PLC úspěšně vyřeší ARP adresu cíle (odpověď přijde za ~28 mikrosekund), ale NIKDY neodešle SYN paket. Cílový port 8080 byl na cílovém počítači otevřen (nc -l 8080) a připraven přijmout spojení.
6) Tento test byl zopakován i bezprostředně po fyzickém power-cyclu PLC (vypnutí/zapnutí napájení, ne jen Halt/Run přes Mosaic) - chování je IDENTICKÉ. ARP se vyřeší okamžitě a správně i s čerstvou/prázdnou ARP cache, SYN se přesto nikdy neodešle. Problém tedy není v zaseklé ARP cache ani v jiném stavu, co by power-cycle vyčistil.
=== CO BYLO OVĚŘENO A VYLOUČENO JAKO PŘÍČINA ===
- IP adresa/maska/brána PLC (GetIPaddress) - správně
- DNS server (GetDNS_IP) - správně nastaveno (1.1.1.1)
- ETH1_STAT.link = TRUE (kabel fyzicky připojen)
- ETH1_STAT.trueMes průběžně roste (PLC aktivně zpracovává pakety na ETH1 - jiný provoz, Mosaic online režim, funguje normálně)
- HW konfigurace testovaného kanálu odpovídá přesně dokumentaci InternetLib (TCP master, zóny 512/512)
- Síťová infrastruktura: stejná síť/VLAN pro PLC i cílové zařízení, žádná WiFi Client Isolation, žádná LAN-scoped firewall pravidla, žádná izolace na switch portu, switch vidí MAC adresu PLC aktivní
- Paměť: PLC na 77% využití registrů 'R'
- Firmware je v10.9 - historické ARP/TCP opravy v changelogu (CP_class_K.TXT) byly provedeny už ve verzích 5.7-10.1, dávno předtím
- Cílová adresa 0.0.0.0 (placeholder ze statické HW konfigurace) - vyloučeno, explicitně nastavována reálná IP přes SetRemoteIPaddress() před EstabTCPconnection(), beze změny výsledku
- ARP cache - vyloučeno, problém přetrvává i s čerstvě vyřešenou ARP adresou bezprostředně po power-cyclu
=== OTÁZKA ===
Jaká by mohla být příčina toho, že PLC v režimu TCP master úspěšně vyřeší ARP adresu cíle, ale nikdy neodešle SYN paket pro navázání TCP spojení a to nezávisle na power-cyclu? Jde o známou chybu firmwaru, nebo možnou HW vadu ethernet rozhraní specifickou pro aktivní (outbound) TCP spojení, zatímco pasivní (příchozí, server) TCP spojení fungují bez problémů?
Tento dotaz čeká na odpověď.
