ERP'nin fiziksel dünyayla konuştuğu yer

CANIAS ERP genelde ekranlar ve raporlar üzerinden düşünülür, ama üretim hatlarında bir barkod okuyucu, bir terazi ya da bir PLC ile doğrudan konuşması gereken senaryolar da var. TROIA bu tür donanımlarla iki yoldan iletişim kurar: seri port (RS-232 tipi cihazlar için) ve TCP port (ağ üzerinden konuşan cihazlar/servisler için). İkisi de aynı üç komutu paylaşır: OPENPORT, READFROMPORT/SENDTOPORT, CLOSEPORT.

Seri port açma

OPENPORT {port} {portadi}
    PARAMETERS
    [BAUDRATE {baudrate}]
    [DATABITS {databits}]
    [STOPBITS {stopbits}]
    [PARITY NONE|ODD|EVEN|MARK|SPACE]
    [FLOWCONTROL ...]
    [RTS {rts}] [DTR {dtr}]
    [ENCODING {encoding}]
    [DEBUG TRUE|FALSE];

Örneğin bir barkod okuyucuyu COM1 üzerinden 9600 baud, 8 data bit, 1 stop bit ve parity olmadan açmak:

OPENPORT 'COM1' 'BARKOD'
    PARAMETERS
    BAUDRATE 9600
    DATABITS 8
    STOPBITS 1
    PARITY NONE;

TCP port açma

OPENPORT TCP {portadi} PORT {portnumarasi} [IPADDRESS {ipadresi}] [ENCODING {encoding}];
OPENPORT TCP 'TERAZI' PORT 4001 IPADDRESS '192.168.5.114' ENCODING 'ISO8859_9';

Veri okuma ve yazma

Her iki port tipi için de aynı komutlar kullanılır:

READFROMPORT {portadi} INTO {degisken};
SENDTOPORT {portadi} {icerik} [{beklemesuresi}];
CLOSEPORT {portadi};

Gerçek bir örnek: teraziden gelen ağırlığı okumak

/* TCP üzerinden bağlı bir teraziden ağırlık okur, hatalıysa kullanıcıyı uyarır. */
LOCAL:
    STRING AGIRLIK;

OPENPORT TCP 'TERAZI' PORT 4001 IPADDRESS '192.168.5.114' ENCODING 'ISO8859_9';

IF SYS_STATUS = 1 THEN
    MESSAGE 'Teraziye bağlanılamadı: ' + SYS_STATUSERROR TYPE ERROR;
    RETURN;
ENDIF;

SENDTOPORT 'TERAZI' 'READ_WEIGHT' 2;
READFROMPORT 'TERAZI' INTO AGIRLIK;

IF AGIRLIK = '' THEN
    MESSAGE 'Teraziden veri alınamadı, zaman aşımı.' TYPE WARNING;
ENDIF;

CLOSEPORT 'TERAZI';

Sık yapılan hatalar

  • Cihaz protokolünü sorgulamadan komut göndermek — SENDTOPORT ile gönderilen komut string'i tamamen cihazın kendi protokolüne bağlıdır (yukarıdaki 'READ_WEIGHT' örnek amaçlıdır); entegrasyona başlamadan önce cihazın kullanım kılavuzundaki komut setini/checksum kurallarını almak, deneme-yanılmayla saatler kaybetmenizi önler.
  • READFROMPORT'un zaman aşımını göz ardı etmek — cihaz yanıt vermezse okuma işlemi sonsuza kadar beklemeyebilir ama boş/hatalı bir sonuç da dönebilir; production kodunda her zaman boş/eksik yanıt senaryosunu ele alın, aksi halde donanım bir an kesildiğinde dialog "asılı" kalmış gibi görünür.
  • Portu kapatmayı unutmak — özellikle seri portlarda, bir önceki oturumda düzgün kapatılmamış port bir sonraki OPENPORT çağrısında "port meşgul" hatasına yol açar; CLOSEPORT'u hata durumlarında da mutlaka çalışacak şekilde kurgulayın.
  • Encoding uyuşmazlığı — cihazdan gelen veri Türkçe karakterler içeriyorsa (örneğin bir etiket yazıcısına gönderilen ürün adı), ENCODING parametresini cihazın beklediği kodlamayla eşleştirmemek, dosya G/Ç'de olduğu gibi burada da karakter bozulmalarına yol açar.
  • TCP ile bağlanırken firewall'u unutmak — OPENPORT TCP uygulama sunucusundan hedef IP/porta doğrudan bir bağlantı açar; application server ile cihaz arasında bir firewall varsa, sorun genelde kodda değil ağ katmanındadır.

Sıradaki adım

Port iletişimini FTP üzerinden dosya transferiyle karşılaştırmak isterseniz, bir sonraki yazıda MAKEFTPCONNECTION/FTPDOWNLOAD komutlarını ele alacağım — ikisi de "harici bir sistemle konuşma" problemini çözüyor ama farklı senaryolar için tasarlanmışlar.