Amacımız: Bu kütüphane kendi PLC‘nizi üretmeniz için hazırlanmıştır. Donanım üzerindeki kontrolünüzün en üst seviyeye taşındığı, Fulmatic SOFT ile programlanabilen cihazlardan oluşan bir ekosistem inşa etmektir. Bu büyük kütüphaneyi dilediğiniz chip ve IDE ile birlikte kullanabilirsiniz. Devre şemasını ve diğer tüm donanım özelliklerini kendiniz belirleyebilirsiniz.
Fulmatic SOFT: Talimatlara uygun şekilde Fulmatic Core kütüphanesini chip kodunuza ekleyin ve artık gömülü sistemlerinizi Fulmatic SOFT ile ladder (IEC 61131-3) dilinde programlayın. Fulmatic SOFT modern PLC’lerin tüm özelliklerinin yanı sıra TCP, UDP, Motion ve SD Card komutları ile size PLC’den fazlasını sunacaktır. Fulmatic SOFT 772 blok (256 DB, 256 PB ve 256 FB ve 4 OB) ve 16384 IO ile size devasa bir alan sunmaktadır.
Free PLC Firmware: PLC kütüphanesini 2048 bayt’a (1026 byte DB0 tarafından kullanılır) kadar ücretsiz kullanabilirsiniz. Daha büyük hafıza gerekli olduğunda lisans (10 USD) satın almalısınız. Lisans satın alınmadığında PLC 60 dakika çalışacaktır. Şeffaf lisanslama modelimizde sözleşme ve karmaşık süreçler yoktur. Devrenize TSHA204A-SSHDA chip eklemelisiniz. Lisans satın aldığınızda size bir anahtar verilir. Lisans uygulaması bu anahtar ile server’ımıza bağlanıp chip’e lisans kodunu seri port veya ethernet ile yükleyecektir. Server’daki lisans sayınızda aynı anda eksilecektir.
Github: PLC kütüphanesini test edebilmeniz için VS Code ile STM32F407VGTx için hazırlanmış örnek projemizi github üzerinden indirebilirsiniz. https://github.com/FultekPLC/Plc-Firmware
Bu projede chip’in neredeyse tüm özelliklerin kullanıldığı tam PLC firmware’ini açık kaynaklı olarak göreceksiniz. Cube MX yazılımı ile chip’in donanım özelliklerini değiştirebilir ve aynı proje üzerinden çalışmaya devam edebilirsiniz. VS Code ile donanım özellikleri ve yazılımı değiştirebilirsiniz. PLC firmware’ine özel fonksiyonlar ekleyebilir ve PLC kodu içinden çalıştırabilirsiniz. Dilediğiniz marka ve model Arm chip’i kullanabilir, IO sayısı ve tiplerini belirleyebilirsiniz. Kısacası hiçbir kısıtlama olmaksızın lisans koşullarına uygun olarak Fulmatic Core kütüphanesini kullanabilirsiniz.
Firmware Güncelleme: Ürününüzü kullanan müşteriler yaptığınız PLC firmware güncellemelerini Fulmatic SOFT ile yapabilir. PLC Firmware update kodu tamamen açık kaynaklı olup örnek proje içerisinde bootloader kodunu görebilir ve değiştirebilirsiniz. Önerdiğimiz kod haricinde kendi bootloader kodunuzu yazabilirsiniz.



Kod Kılavuzu
200 KB boyutunda örnek projeyi kolaylıkla kullanabilmeniz için çalışıyoruz. Bir chip için 200 KB kod oldukça büyük bir proje demektir. Bu boyutta bir projeyi anlamak, değiştirmek ve uygulamak kolay olmayacaktır. Bu sayfada ve kod içerisinde fonksiyonları açıklamaya çalıştık. Daha iyi açıklayabilmek için de çalışıyoruz. Github depomuzda tartışmalar bölümünde mümkün olduğu kadar sorularınız yanıtlamaya çalışacağız. Maalesef Fulmatic Core ile ilgili ücretsiz destek sağlamıyoruz. Devre kartı tasarımı dahil tüm işlemleri sizin adınıza yapmamız için bizden teklif alabilirsiniz.
Github linkimizden örnek projeyi indirebilirsiniz: https://github.com/FultekPLC/Plc-Firmware Örnek projede PLC’nin tüm özelliklerini açık kaynaklı kod ile görebilir ve değiştirebilirsiniz. İhtiyacınız olmayan fonksiyonları projeden çıkartabilirsiniz. Yeni fonksiyonlar ekleyebilirsiniz.
IDE ve derleme araçları ile ilgili tüm bilgileri github depomuzda görebilirsiniz. Bu sayfada MCU kodunuz ile kütüphane entegrasyonu için kullanılan fonksiyonları açıklayacağız.
FulmaticConfig.h
Firmware versiyonu ve dize boyut tanımları bu dosya ile yapılmaktadır.
FulmaticCore.h
Kütüphane içerisinde olan ve MCU kodunuzdan çağıracağınız fonksiyonların başlıklarının bulunduğu dosyadır. Dosya içerisinde tüm fonksiyonlar ile ilgili açıklamaları görebilirsiniz. Kütüphane pek çok değişken ve dize ile çalışır. MCU kodunuzda bu dizleri ve değişkenleri oluşturmalısınız. Variables_TypeDef yapısı oluşturduğunuz değişkenleri kütüphane’ye iletmek için kullanılır. Bu yapıda değişiklik yapamazsınız.
FulmaticInit: Chip ilk açıldığında sadece bir defa çalışması gereklidir. Return 1 olduğunda lisans chip’i doğru şekilde okunmuş ve lisanslı çalışıyor demektir.
FulmaticExecute: main.c içerisinde PLC ladder kodunun yürütülmesi için çağrılan fonksiyondur. Startup blok (PLC run olurken), Main block (her saykıl), Shutdown blok (PLC stop olurken) ve Interrput.c içersinde dijital input kesmesi geldiğinde ve Fulmatic.c içerisinde de zaman bazlı (Timer) kesmesi ile çağrılır.
Fulmatic.c
Kütüphanenin kodunuz içinde kullanılabilmesi için gereken tüm fonksiyonlar Fulmatic.c dosyasında toplanmıştır. Bu dosya içerisinden diğer dosyalara dallanmaktadır. Fonksiyonları dört başlık altında topluyoruz. Fonksiyonların açıklamaları gövdenin bulunduğu dosyada yazılmıştır.
- Örnek proje için gerekli olan ve kütüphanenin kullanmadığı fonksiyonlar.
- Kütüphanenin kullandığı ve kodunuzda mutlaka bulunması gereken fonksiyonlar.
- Kütüphanenin lisans için kullandığı fonksiyonlar. Lisanssız çalışmada gerekli olmayanlar.
- Kullanılan PLC komutlarına göre kütüphanenin kullanacağı fonksiyonlar. Örneğin TCP, UDP, SPI, seri port ve SD kart gibi işlemler PLC’nizde kullanılmayacaksa bu fonksiyonlar olmadan da çalışır.
_DefaultEprom: Fulmatic SOFT ile seçilebilen donanım ayarları PlcSetupEprom[STPMEMORYSIZE] ve ladder kodları PlcEprom[PRGMEMORYSIZE] dizilerinde saklanır. Bu dosyada bulunan _DefaultEprom fonksiyonu PLC’nin varsayılan ayarlarını barındırır. Kodunuzda bu dizileri kullanarak yapılandırmayı belli ölçüde özelleştirebilirsiniz.
_EachMilliSecond: Her milisaniye’de bir çalışan bu fonksiyon main ve kütüphane içinden çalıştırılır. Örnek projede Interrupt.c içinde TIM7_IRQHandler ile bayraklar set edilir, direkt olarak çalıştırılmaz. Ayrıca TIM7->ARR değeri RTC ile kalibre edilir. Fulmatic.c içindeki _RtcCalibration fonksiyonunu inceleyiniz. Doğru olmayan kalibrasyon ile PLC’deki zaman bazlı tüm işlemler küçükte olsa hatalı çalışacaktır.
_DelayUs: Chip frekansına göre tam doğru olarak ayarlanması için kodunu değiştirmeniz gerekebilir. Uzun bir süre ile test edip kalibre etmelisiniz. 168 MHz için kalibre edilmiştir.
_SetOutputs: Normal işleyişte girişlerin okunup, çıkışların yazılması main.c içerisinde olmaktadır. Ancak zaman bazlı veya dijital giriş kesmeleri çalıştığında OB2 kesme bloğu çalışır. Ve çıkışların gecikme olmadan set edilmesi için kütüphane içerisinden çağrılır.
_GetMsTimerCount: Pek çok işlemde süre ölçümü için kullanılmaktadır. Kodunuzda mutlaka bulunmalıdır. Bir milisaniyelik timer’ın değerinin okunmasını sağlamalısınız.
_CrcCalculate: Donanım ile checksum hesaplamak için kullanılır. Kullandığınız chip’e göre doğru şekilde çalışmasını sağlamalısınız.
Communication.c
Ethernet, Seri port ve SPI’ın PLC içerisinde kullanılması için gerekli kodlar bu dosyadadır. Modbus ve Fulmatic SOFT ile gelen çağrılar bu dosya içerisinde alınır. Cevaplama gecikmeli olarak main.c içerisinden başlatılarak veri tutarlılığı sağlanır. Ayrıca firmware update ve SD kart kodları bu dosyada açık şekilde yazılmıştır. Fulmatic SOFT firmware update ve SD kart işlemlerini bu kodlar ile yapmaktadır. Fulmatic SOFT yerine kendi yazılımınız ile benzer işlemleri yapmak için bu kodları değiştirebilirsiniz. Fulmatic SOFT diğer işlemler ve Modbus işlemleri bu kod aracılığı ile kütüphaneye iletilir ve cevaplanır. Kodu değiştirerek Modbus çağrılarını kütüphaneye göndermeden de cevaplayabilirsiniz.
Flash.c
PLC kodu ve kalıcı timer-counter bilgileri PLC’nin enerjisi kesilirken flash’a kaydedilir. PLC enerji verildiğinde de flash’dan son kaydedilmiş kod okunur. Flash.h dosyasında kullandığınız chip’in sektör bilgilerini ayarlamayı unutmayın. PLC enerjisinin kesildiğini algılamak için aşağıdaki devreyi kullanabilirsiniz.

Bu devre 24 volt yaklaşık 19 volt’a indiğinde Shutdown detect pinini low yapacaktır. C1 kondansatörü ile chip bir süre daha çalışması sağlanır. Bu süre içerisinde flash’ın silinip tekrar yazılması risklidir. Bu nedenle aşağıdaki adımlar uygulanmalıdır.
- PLC ilk enerjilendiğinde sektör 10 -> sektör 11’e kopyalıyoruz. Açılışta enerji kesilirse sağlam data sektör 11 içerisinde saklanıyor.
- Flash’a yeni bir data kaydetmek için önce silmek gereklidir. Silmek kaydetmekten çok daha uzun sürer. Bu nedenle açılışta sektör 10’u silip, kapanışı bekliyoruz.
- Kapanış algılama devresi bize 1 saniyeden biraz daha fazla zaman sağlıyor. Kapanış algılandığında data sektör 10’a 100-200 ms içinde kaydedilir. OB 1 shutdown blok kapanış öncesi çalışacağından ve PLC’de büyük bir ladder kodu olabileceğinden dolayı C1 kondansatörü en az 2200 uf olmalıdır. Büyük kapasitenin devrede şok yaratmasını önlemek için akım sınırlayıcı 100 ohm direnç kullanılmıştır.
- PLC açılırken sektör 10’da tüm datayı okuyup checksum kontrolü yapar. PLC açılırken enerji kesilmişse checksum kontrolü başarısız olacaktır. Panik yok sektör 11’de sağlam data her zaman mevcut. Açılış sektör 11’den otomatik olarak yapılır.
Interrupt.c
Dijital input, ADC, Timer ve UART kesmeleri bu dosyada bulunmaktadır. Fulmatic.c içinde _INTSetup fonksiyonunda PLC çalışma moduna göre açılıp kapatılır. _INTSetup kodunu donanımınıza uygun hale getirmeyi unutmayın. Bu dosyadaki fonksiyonların hızlı çalışması gereklidir. Örnek kodumuzda kod okunabilirliğini artırmak için switch komutu kullandık. Fakat daha hızlı çalışmasını sağlayacak yöntemler var. Örneğin switch içindeki işlemler ayrı fonksiyonlar olarak yazılabilir.
- void Handle_Enkoder(void)
- void (*EXTI0_Handler_Ptr)(void);
- INTSetup içinde Fulmatic SOFT ile yapılan seçime bağlı olarak: EXTI0_Handler_Ptr = Handle_Enkoder;
- Kesme geldiğinde: EXTI0_IRQHandler içinde EXTI0_Handler_Ptr(); çalıştırın.
Diğer bir hızlandırma işlemi de bayt – 32 bit dönüşümleridir. STM serisi için bu kodu kullanabilirsiniz. *(int32_t *)&PlcIO[EncIAdr[0]] = __rev(ValueS32);
Kesme bayraklarının temizlenme işlemini HAL kütüphanesi ile yapmamalıyız. Bunun yerine daha hızlı olan direkt register değerini değiştirme yolunu tercih etmeliyiz. TIM3->SR = 0; //__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
Dijital giriş kesmeleri: Hızlı sayıcı, enkoder ve benzeri işlemler için kullanılır.
ADC: DMA kullanmıyoruz, ADC okuma işlemlerini kesme içinde yapıyoruz. Böylece filtre işlemlerini yapma imkanımız oluyor.
Timer: Bir milisaniyelik timer ve PTO çıkışları için kullanıyoruz. Timer’ın her milisaniye kesmesi yeterli değildir, aynı zamanda 0-999 sayması zorunludur.
USART: Seri port kesmeleri data alım ve gönderimlerinde kullanılır. Ayrıca Fulmatic.c -> _EachMilliSecond içinde de RS485 enable pin işlemleri vardır.
SdCard.c
SD kart işlemleri bu dosyada yapılır. Örnek projemizdeki yapıdan daha farklı bir şekilde de yapabilirsiniz. PLC içerisine dosya yüklemek veya indirmek için Communication.c içerisinde iletişim kodları açık kaynaklı olarak yazılmıştır. Fulmatic SOFT ile dosya yükleyip indirebilirsiniz. Projenizde SD kart yoksa tüm fonksiyonları silebilirsiniz.
main.c
Cube MX’ile projeyi her kaydettiğinizde bu dosya değişecektir. Yazdığınız komutların değişmemesi için kodunuzu Cube MX’in kodunuz için ayırdığı alanlara yazmalısınız. /* USER CODE BEGIN 2 */ Kodu buraya yazınız. /* USER CODE END 2 */
Kütüphane için gerekli olan tüm değişkenleri bu dosyada oluşturabilirsiniz. Büyük dizileri belli bir adreste oluşturmanız gerekli olabilir uint8_t PlcEprom[PRGMEMORYSIZE] __attribute__((section(“.ccmram”)));
while döngüsünde ki işlemleri dikkatle inceleyiniz. Yaptığınız değişlikler genel yapıyı bozmamalıdır. Programınızın diğer bölümlerinde yazdığınız kodları bu döngüyü yavaşlatmamalıdır.
