Tujuan kami: Pustaka ini dirancang untuk membantu Anda membangun PLC Anda sendiri. Tujuannya adalah untuk menciptakan ekosistem perangkat yang dapat diprogram dengan Fulmatic SOFT , memberi Anda kendali maksimal atas perangkat keras Anda . Anda dapat menggunakan pustaka yang ekstensif ini dengan chip dan IDE apa pun yang Anda pilih. Anda dapat menentukan diagram rangkaian dan semua spesifikasi perangkat keras lainnya sendiri.
Fulmatic SOFT: Tambahkan pustaka Fulmatic Core ke kode chip Anda sesuai petunjuk, dan Anda sekarang dapat memprogram sistem tertanam Anda dengan Fulmatic SOFT menggunakan bahasa ladder ( IEC 61131-3 ). Fulmatic SOFT menawarkan lebih dari sekadar PLC, dengan semua fitur PLC modern, ditambah perintah TCP, UDP, Motion, dan SD Card. Fulmatic SOFT menyediakan ruang kerja yang luas dengan 771 blok (255 DB, 256 PB, 256 FB, dan 4 OB) dan 16384 IO.
Firmware PLC Gratis: Anda dapat menggunakan pustaka PLC secara gratis hingga 2048 byte (1026 byte digunakan oleh DB0). Jika Anda membutuhkan lebih banyak memori, Anda harus membeli lisensi (10 USD) . Tanpa lisensi, PLC akan beroperasi selama 60 menit. Model lisensi transparan kami tidak memiliki kontrak atau proses yang rumit. Anda harus menambahkan chip TSHA204A-SSHDA ke sirkuit Anda. Saat Anda membeli lisensi, Anda akan diberikan kunci. Aplikasi lisensi akan terhubung ke server kami dengan kunci ini dan mengunggah kode lisensi ke chip melalui port serial atau Ethernet. Jumlah lisensi Anda di server akan berkurang secara bersamaan.
Github: Anda dapat mengunduh proyek contoh kami yang disiapkan dengan VS Code untuk STM32F407VGTx dari Github sehingga Anda dapat menguji pustaka PLC . https://github.com/FultekPLC/Plc-Firmware
Dalam proyek ini, Anda akan menemukan firmware PLC lengkap, yang memanfaatkan hampir semua fitur chip, tersedia sebagai sumber terbuka. Anda dapat memodifikasi spesifikasi perangkat keras chip dengan perangkat lunak Cube MX dan melanjutkan pengerjaan proyek yang sama. Anda juga dapat mengubah spesifikasi perangkat keras dan perangkat lunak dengan VS Code. Anda dapat menambahkan fungsi khusus ke firmware PLC dan menjalankannya dari dalam kode PLC . Anda dapat menggunakan merek dan model chip ARM apa pun, dengan menentukan jumlah dan jenis IO. Singkatnya, Anda dapat menggunakan pustaka Fulmatic Core tanpa batasan apa pun, sesuai dengan ketentuan lisensi.
Pembaruan Firmware: Pelanggan yang menggunakan produk Anda dapat melakukan pembaruan firmware PLC dengan Fulmatic SOFT. Kode pembaruan firmware PLC sepenuhnya bersifat open source, dan Anda dapat melihat serta memodifikasi kode bootloader dalam proyek contoh. Selain kode yang kami rekomendasikan, Anda dapat menulis kode bootloader Anda sendiri.



Panduan Kode
Kami sedang berupaya membuat proyek sampel 256 KB ini mudah digunakan. Kode 256 KB untuk sebuah chip merupakan proyek yang cukup besar. Memahami, memodifikasi, dan mengimplementasikan proyek sebesar ini tidak akan mudah. Kami telah mencoba menjelaskan fungsi-fungsi tersebut di halaman ini dan dalam kode. Kami juga sedang berupaya untuk menjelaskannya dengan lebih baik. Kami akan mencoba menjawab pertanyaan Anda sebanyak mungkin di bagian diskusi repositori Github kami. Sayangnya, kami tidak menyediakan dukungan gratis untuk Fulmatic Core. Anda dapat meminta penawaran dari kami untuk menangani semua proses atas nama Anda, termasuk desain papan sirkuit.
Anda dapat mengunduh proyek contoh dari tautan Github kami: https://github.com/FultekPLC/Plc-Firmware. Dalam proyek contoh ini, Anda dapat melihat dan memodifikasi semua fitur PLC menggunakan kode sumber terbuka. Anda dapat menghapus fungsi yang tidak Anda butuhkan dan menambahkan fungsi baru.
Anda dapat menemukan semua informasi tentang IDE dan alat bantu pembuatan di repositori GitHub kami. Di halaman ini, kami akan menjelaskan fungsi-fungsi yang digunakan untuk integrasi pustaka dengan kode MCU Anda.
FulmaticConfig.h
Definisi versi firmware dan ukuran string dibuat dalam file ini.
FulmaticCore.h
File ini berisi header fungsi-fungsi dalam pustaka yang akan Anda panggil dari kode MCU Anda. Anda dapat menemukan deskripsi semua fungsi dalam file ini. Pustaka ini bekerja dengan banyak variabel dan string. Anda harus membuat string dan variabel ini dalam kode MCU Anda. Struktur `variables_TypeDef` digunakan untuk meneruskan variabel yang Anda buat ke pustaka. Anda tidak dapat memodifikasi struktur ini.
FulmaticInit : Perintah ini hanya perlu dijalankan sekali saat chip pertama kali dinyalakan. Nilai kembalian 1 menunjukkan bahwa chip lisensi telah dibaca dengan benar dan beroperasi di bawah lisensi.
FulmaticExecute adalah fungsi yang dipanggil di dalam main.c untuk mengeksekusi kode ladder PLC . Fungsi ini dipanggil selama blok Startup (saat PLC dimulai), blok Main (pada setiap siklus), blok Shutdown (saat PLC berhenti), ketika terjadi interupsi input digital di dalam Interrupt.c, dan ketika terjadi interupsi berbasis waktu (Timer) di dalam Fulmatic.c.
Fulmatic.c
Semua fungsi yang dibutuhkan agar pustaka dapat digunakan dalam kode Anda dikumpulkan dalam file Fulmatic.c. File ini bercabang ke file-file lain. Kami mengelompokkan fungsi-fungsi tersebut ke dalam empat kategori. Deskripsi fungsi-fungsi tersebut ditulis dalam file tempat isi fungsi tersebut berada.
- Fungsi-fungsi yang dibutuhkan untuk proyek contoh yang tidak digunakan oleh pustaka ini.
- Fungsi-fungsi yang digunakan oleh pustaka yang harus disertakan dalam kode Anda.
- Fungsi-fungsi yang digunakan pustaka untuk keperluan perizinan. Fungsi-fungsi yang tidak diperlukan untuk penggunaan tanpa lisensi.
- Fungsi-fungsi pustaka bergantung pada perintah PLC yang digunakan. Misalnya, jika operasi seperti TCP, UDP, SPI, port serial, dan kartu SD tidak digunakan di PLC Anda, pustaka akan tetap berfungsi tanpa fungsi-fungsi tersebut.
_DefaultEprom: Pengaturan perangkat keras yang dapat dipilih dengan Fulmatic SOFT disimpan dalam array PlcSetupEprom[STPMEMORYSIZE] dan kode ladder , PlcEprom[PRGMEMORYSIZE]. Fungsi _DefaultEprom dalam file ini berisi pengaturan default PLC. Anda dapat menyesuaikan konfigurasi sampai batas tertentu dengan menggunakan array ini dalam kode Anda.
`_EachMilliSecond`: Fungsi ini, yang berjalan setiap milidetik, dieksekusi dari dalam file utama dan pustaka. Dalam proyek contoh, flag diatur menggunakan `TIM7_IRQHandler` di `Interrupt.c`, bukan dieksekusi secara langsung. Selain itu, nilai `TIM7->ARR` dikalibrasi dengan RTC. Harap periksa fungsi `_RtcCalibration` di `Fulmatic.c`. Kalibrasi yang salah akan menyebabkan semua operasi berbasis waktu di PLC berjalan dengan kesalahan kecil.
_DelayUs: Anda mungkin perlu memodifikasi kode untuk memastikan pengaturan yang tepat sesuai dengan frekuensi chip. Anda harus menguji dan mengkalibrasinya dalam jangka waktu yang lama. Kode ini dikalibrasi untuk 168 MHz.
_SetOutputs: Biasanya, input dibaca dan output ditulis di dalam main.c. Namun, ketika terjadi interupsi berbasis waktu atau input digital, blok interupsi OB2 dipicu. Blok ini kemudian dipanggil dari dalam pustaka untuk mengatur output tanpa penundaan.
_GetMsTimerCount : Digunakan untuk mengukur durasi dalam banyak operasi. Fungsi ini harus ada dalam kode Anda. Anda perlu mengaktifkan pembacaan nilai timer dalam milidetik.
_CrcCalculate: Digunakan untuk menghitung checksum menggunakan perangkat keras. Anda harus memastikan fungsinya berjalan dengan benar tergantung pada chip yang Anda gunakan.
Komunikasi.c
File ini berisi kode yang diperlukan untuk menggunakan Ethernet, port serial, dan SPI di dalam PLC. Panggilan dari Modbus dan Fulmatic SOFT diterima dalam file ini. Konsistensi data dipastikan dengan memulai respons dengan penundaan dari main.c. Selain itu, kode pembaruan firmware dan kartu SD secara eksplisit ditulis dalam file ini. Fulmatic SOFT melakukan pembaruan firmware dan operasi kartu SD menggunakan kode ini. Anda dapat memodifikasi kode ini untuk melakukan operasi serupa dengan perangkat lunak Anda sendiri, bukan Fulmatic SOFT. Operasi Fulmatic SOFT dan operasi Modbus lainnya dikirim ke dan ditanggapi oleh pustaka melalui kode ini. Dengan memodifikasi kode, Anda juga dapat menanggapi panggilan Modbus tanpa mengirimkannya ke pustaka.
Flash.c
Kode PLC dan informasi penghitung-pengatur waktu persisten disimpan ke flash saat PLC dimatikan. Saat PLC dihidupkan kembali, kode terakhir yang tersimpan akan dibaca dari file flash.h. Ingat untuk mengatur informasi sektor chip yang Anda gunakan. Anda dapat menggunakan rangkaian berikut untuk mendeteksi kapan PLC dimatikan.

Rangkaian ini akan mengatur pin Deteksi Pemutusan Daya menjadi rendah ketika tegangan turun dari 24 volt menjadi sekitar 19 volt. Kapasitor C1 memungkinkan chip untuk terus beroperasi dalam waktu singkat. Selama periode yang diperpanjang ini, menghapus dan menulis ulang flash berisiko. Oleh karena itu, langkah-langkah berikut harus diikuti.
- Saat PLC pertama kali dinyalakan, kita menyalin sektor 10 ke sektor 11. Jika daya terputus selama proses startup, data yang utuh akan disimpan di sektor 11.
- Untuk menyimpan data baru ke Flash, Anda perlu menghapusnya terlebih dahulu. Menghapus membutuhkan waktu jauh lebih lama daripada menyimpan. Oleh karena itu, kami menghapus sektor 10 saat startup dan menunggu hingga proses shutdown.
- Sirkuit deteksi pematian memberi kita waktu sedikit lebih dari 1 detik. Ketika pematian terdeteksi, data disimpan ke sektor 10 dalam waktu 100-200 ms. Karena blok pematian OB 1 akan berjalan sebelum pematian dan mungkin ada kode ladder yang besar di PLC, kapasitor C1 harus minimal 2200 µF. Resistor pembatas arus 100 ohm digunakan untuk mencegah sengatan listrik pada sirkuit akibat kapasitansi yang besar.
- Saat PLC dinyalakan, ia membaca semua data di sektor 10 dan melakukan pemeriksaan checksum. Jika daya terputus saat PLC sedang dinyalakan, pemeriksaan checksum akan gagal. Jangan panik, data yang andal selalu tersedia di sektor 11. Proses penyalaan dilakukan secara otomatis dari sektor 11.
Interupsi.c
Input digital, ADC, Timer, dan interupsi UART terletak di dalam file ini. Fungsi-fungsi ini diaktifkan dan dinonaktifkan sesuai dengan mode operasi PLC dalam fungsi _INTSetup di dalam Fulmatic.c. Ingatlah untuk menyesuaikan kode _INTSetup dengan perangkat keras Anda. Fungsi-fungsi dalam file ini perlu dijalankan dengan cepat. Dalam contoh kode kami, kami menggunakan perintah switch untuk meningkatkan keterbacaan kode. Namun, ada cara untuk membuatnya berjalan lebih cepat. Misalnya, operasi di dalam perintah switch dapat ditulis sebagai fungsi terpisah.
- void Handle_Encoder(void)
- void (*EXTI0_Handler_Ptr)(void);
- Tergantung pada pilihan yang dibuat dengan Fulmatic SOFT di INTSetup: EXTI0_Handler_Ptr = Handle_Encoder;
- Saat terjadi interupsi: Jalankan EXTI0_Handler_Ptr(); di dalam EXTI0_IRQHandler.
Metode akselerasi lainnya adalah konversi byte ke 32 bit. Anda dapat menggunakan kode ini untuk seri STM: *(int32_t *)&PlcIO[EncIAdr[0]] = __rev(ValueS32);
Kita sebaiknya tidak menggunakan pustaka HAL untuk menghapus flag interupsi. Sebaliknya, kita sebaiknya memilih metode yang lebih cepat yaitu dengan memodifikasi nilai register secara langsung. TIM3->SR = 0; //__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
Interupsi input digital: Digunakan untuk penghitung kecepatan tinggi, encoder, dan aplikasi serupa.
ADC: Kami tidak menggunakan DMA; kami melakukan operasi pembacaan ADC di dalam interupsi. Hal ini memungkinkan kami untuk melakukan operasi penyaringan.
Timer: Kami menggunakan ini untuk timer satu milidetik dan output PTO. Timer tidak cukup hanya menginterupsi setiap milidetik; timer juga harus menghitung dari 0 hingga 999.
USART: Interupsi port serial digunakan untuk transmisi dan penerimaan data. Selain itu, Fulmatic.c -> _EachMilliSecond berisi operasi pin enable RS485.
SdCard.c
Operasi kartu SD dilakukan dalam file ini. Anda juga dapat melakukannya dengan cara yang berbeda dari contoh proyek kami. Kode komunikasi untuk mengunggah atau mengunduh file ke PLC ditulis dalam open source di dalam Communication.c. Anda dapat mengunggah dan mengunduh file menggunakan Fulmatic SOFT. Jika proyek Anda tidak memiliki kartu SD, Anda dapat menghapus semua fungsi.
utama.c
File ini akan berubah setiap kali Anda menyimpan proyek dengan Cube MX. Untuk memastikan perintah Anda tetap tidak berubah, Anda harus menulis kode Anda di area yang disediakan untuk kode Anda di Cube MX. /* USER CODE BEGIN 2 */ Tulis kode Anda di sini. /* USER CODE END 2 */
Anda dapat membuat semua variabel yang dibutuhkan untuk pustaka di file ini. Anda mungkin perlu membuat array besar di alamat tertentu. `uint8_t PlcEprom[PRGMEMORYSIZE] __attribute__((section(“.ccmram”))));`
Periksa dengan cermat operasi di dalam loop while. Perubahan apa pun yang Anda buat tidak boleh mengganggu struktur keseluruhan. Kode yang ditulis di bagian lain program Anda tidak boleh memperlambat loop ini.
