Привет всем. Можете ПОЖАЛУЙСТА перевести программу из среды Bascom в язык Си
Основная задача программы: требуется вывести напряжение снимаемое с АЦП микроконтроллера mega8 в скада систему.
Работа АВР с скада осуществляется по протоколу MODBUS-RTU. Все уже сделано. Только очень нужно на языке Си.
Вот собственно и программа на баском:
ИНИЦИАЛИЗАЦИЯ, ПЕРЕМЕННЫЕ
$lib "modbus.lbx" ' Библиотека modbus содержит функцию подсчета контрольной суммы crcMB
$Regfile="m8def.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32
$baud = 9600 'скорость UART
Config Portd.3 = Output 'разрешение на передачу по 485
Enable_tx Alias Portd.3 'в микросхеме MAX485 переключает направление прием-передача
Open "comb.3:9600,8,n,1" For Output As #1 'Софтварный USART
Open "comb.4:9600,8,n,1" For Input As #2 'Используется для отладки
Config Pind.1 = Output 'Аппаратный USART
Config Pind.0 = Input 'Для связи с ОПЦ сервером
Echo Off
Config Adc = Single , Prescaler = 128 , Reference = Avcc 'Конфигурируем АЦП
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Pinc.5 = Input
Start Adc
Dim Inbuf(10) As Byte 'Буфер приема данных по протоколу MODBUS
Dim OutBuf(100) As Byte 'Буфер для передачи данных по протоколу MODBUS
Dim CRC As Word 'CRC
Dim Offset As Word 'Сдвиг
Dim i As Byte
Dim j As Byte
Dim S As String * 100
Dim Fst As Byte
Dim ByteCount As Byte
Enable Interrupts
Dim Inputs(9) As Word 'Входы ПЛК
Const Modbus_slave = 1 'Адрес SLAVE устройства задаем "1"
Const InputsCount = 9 'Количество Входов
Const InAdrr = 512 'Стартовый адресс для входов
ОСНОВНОЙ КОД
for i=1 to InputsCount
Inputs(i)=i
Next
Do
Inputs(1) = Getadc(1)
If Ischarwaiting() = 1 Then 'проверка наличия команды в буфере UART
$timeout = 1000 'Таймаут чтения
Inputbin Inbuf(1) 'Читаем буфер
s="OPC>"
For i = 1 To 8 'преобразуем в текст и отправляем в порт отладки
s=s+Hex(Inbuf(i)) 'преобразуем в текст и отправляем в порт отладки
Next 'преобразуем в текст и отправляем в порт отладки
Offset = Makeint(Inbuf(7) , Inbuf(8)) 'Загоняем принятую CRC в переменную типа "слово"
If Offset <> Crcmb(Inbuf(1) , 6) Then 'Проверка CRC (контрольной суммы)
s=s+" CRC ERR"
Else
s=s+" CRC OK"
EndIf
Print #1 , s 'преобразуем в текст и отправляем в порт отладки
if Inbuf(1)=Modbus_slave then 'если адрес совпадает с нашим
if Inbuf(2)=3 then 'если приняли комманду на чтение - 3
Offset=Makeint(Inbuf(4) , Inbuf(3)) 'Читаем запрашиваемый адрес
ByteCount=Inbuf(6) 'Читаем длинну комманды
Fst=Offset-InAdrr 'Вычисляем с какого номера элемента из массива запрашивается чтение
if Offset >= InAdrr And Fst < InputsCount then Fst=Fst+1
ByteCount=Inbuf(6)+Fst 'Количество переменных для чтения
ByteCount=ByteCount-1
OutBuf(1)=Modbus_slave 'Формирыем ответ 1-Адресс
OutBuf(2)=3 'Функция
OutBuf(3)=Inbuf(6)*2 'Размер пакета
j=3 'Положение текущего элемента в буфере
for i=Fst to ByteCount 'Складываем в буфер
j=j+1
OutBuf(j)=High(Inputs(i))
j=j+1
OutBuf(j)=Low(Inputs(i))
'Print #1 , Inputs(i)
Next
CRC = Crcmb(OutBuf(1) , j) 'создаем CRC (контрольную сумму)
j=j+1
OutBuf(j) = Low(CRC) 'передаем CRC в буфер MODBUS
j=j+1
OutBuf(j) = High(CRC)
Printbin OutBuf(1) ; j 'Отправляем буфер в канал связи
s="PLC>"
For i = 1 To j
s=s+Hex(OutBuf(i))
Next
Print #1 , s
endif
endif
s=""
endif
Loop
Return