И снова я) Подскажите как получается такой адрес?
Если в плк имеем адрес 78:11 Включение вентилятора 18
Вложение 84866
то в панели на кнопке включения этого же вентилятора имеем адрес 0x 1259
Вложение 84867
Вложение 84868
Вид для печати
И снова я) Подскажите как получается такой адрес?
Если в плк имеем адрес 78:11 Включение вентилятора 18
Вложение 84866
то в панели на кнопке включения этого же вентилятора имеем адрес 0x 1259
Вложение 84867
Вложение 84868
Есть руководство по программированию ПЛК1ХХ, там много чего описано:
Вложение 84869
Всем спасибо большое , разобрался
Накидал программу, для быстрого подсчета всех адресов делаем экспорт конфигурации из плк или пишем количество блоков, по порядку ручками в программу и получаем весь список адресов. Пишите ваши пожелания и хотелки, добавлю)
Вложение 84878
Код:import tkinter as tk
from tkinter import ttk, messagebox, filedialog
class ModbusAddressCalculatorOrder(tk.Tk):
def __init__(self):
super().__init__()
self.title("Калькулятор адресов")
self.geometry("750x650")
self.resizable(True, True)
self.blocks = []
self.create_widgets()
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
self.rowconfigure(3, weight=1)
self.rowconfigure(6, weight=1)
def create_widgets(self):
padding = {'padx': 10, 'pady': 5}
ttk.Label(self, text="Тип блока:").grid(column=0, row=0, sticky="w", **padding)
self.type_var = tk.StringVar()
self.type_combo = ttk.Combobox(self, textvariable=self.type_var,
values=["Float", "2 byte", "8 bit", "4 bytes"], state="readonly")
self.type_combo.grid(column=1, row=0, sticky="ew", **padding)
self.type_combo.current(0)
ttk.Label(self, text="Количество:").grid(column=0, row=1, sticky="w", **padding)
self.count_entry = ttk.Entry(self)
self.count_entry.grid(column=1, row=1, sticky="ew", **padding)
self.count_entry.insert(0, "1")
self.btn_add = ttk.Button(self, text="Добавить блок", command=self.add_block)
self.btn_add.grid(column=0, row=2, columnspan=2, pady=10, sticky="ew")
self.btn_load_exp = ttk.Button(self, text="Загрузить .EXP", command=self.load_exp_file)
self.btn_load_exp.grid(column=0, row=7, columnspan=2, pady=10, sticky="ew")
tree_frame = ttk.Frame(self)
tree_frame.grid(column=0, row=3, columnspan=2, sticky="nsew", padx=10, pady=5)
tree_frame.columnconfigure(0, weight=1)
tree_frame.rowconfigure(0, weight=1)
self.tree = ttk.Treeview(tree_frame, columns=("Тип", "Количество"), show="headings")
self.tree.heading("Тип", text="Тип блока")
self.tree.heading("Количество", text="Количество")
self.tree.column("Тип", width=250)
self.tree.column("Количество", width=100)
self.tree.grid(column=0, row=0, sticky="nsew")
tree_scrollbar = ttk.Scrollbar(tree_frame, orient="vertical", command=self.tree.yview)
tree_scrollbar.grid(column=1, row=0, sticky="ns")
self.tree.configure(yscrollcommand=tree_scrollbar.set)
btn_frame = ttk.Frame(self)
btn_frame.grid(column=0, row=4, columnspan=2, pady=10, sticky="ew")
btn_frame.columnconfigure((0, 1, 2), weight=1)
ttk.Button(btn_frame, text="Удалить блок", command=self.delete_block).grid(column=0, row=0, padx=5, sticky="ew")
ttk.Button(btn_frame, text="Вверх", command=self.move_up).grid(column=1, row=0, padx=5, sticky="ew")
ttk.Button(btn_frame, text="Вниз", command=self.move_down).grid(column=2, row=0, padx=5, sticky="ew")
self.btn_calc = ttk.Button(self, text="Рассчитать адреса", command=self.calculate_addresses)
self.btn_calc.grid(column=0, row=5, columnspan=2, pady=10, sticky="ew")
self.text_frame = ttk.Frame(self)
self.text_frame.grid(column=0, row=6, columnspan=2, sticky="nsew", padx=10, pady=5)
self.text_frame.columnconfigure(0, weight=1)
self.text_frame.rowconfigure(0, weight=1)
self.result_text = tk.Text(self.text_frame, wrap="none", font=("Consolas", 10))
self.result_text.grid(column=0, row=0, sticky="nsew")
self.scrollbar_v = ttk.Scrollbar(self.text_frame, orient="vertical", command=self.result_text.yview)
self.scrollbar_v.grid(column=1, row=0, sticky="ns")
self.result_text.configure(yscrollcommand=self.scrollbar_v.set)
self.scrollbar_h = ttk.Scrollbar(self.text_frame, orient="horizontal", command=self.result_text.xview)
self.scrollbar_h.grid(column=0, row=1, sticky="ew")
self.result_text.configure(xscrollcommand=self.scrollbar_h.set)
self.result_text.config(state="normal")
def add_block(self):
t = self.type_var.get()
c = self.count_entry.get()
try:
c = int(c)
if c <= 0:
raise ValueError
except ValueError:
messagebox.showerror("Ошибка", "Введите корректное положительное число для количества!")
return
self.blocks.append({"type": t, "count": c})
self.refresh_tree()
def refresh_tree(self):
self.tree.delete(*self.tree.get_children())
for idx, block in enumerate(self.blocks):
self.tree.insert("", "end", iid=idx, values=(block["type"], block["count"]))
def delete_block(self):
selected = self.tree.selection()
if not selected:
messagebox.showinfo("Информация", "Выберите блок для удаления.")
return
idx = int(selected[0])
del self.blocks[idx]
self.refresh_tree()
def move_up(self):
selected = self.tree.selection()
if not selected:
messagebox.showinfo("Информация", "Выберите блок для перемещения.")
return
idx = int(selected[0])
if idx == 0:
return
self.blocks[idx], self.blocks[idx - 1] = self.blocks[idx - 1], self.blocks[idx]
self.refresh_tree()
self.tree.selection_set(idx - 1)
def move_down(self):
selected = self.tree.selection()
if not selected:
messagebox.showinfo("Информация", "Выберите блок для перемещения.")
return
idx = int(selected[0])
if idx == len(self.blocks) - 1:
return
self.blocks[idx], self.blocks[idx + 1] = self.blocks[idx + 1], self.blocks[idx]
self.refresh_tree()
self.tree.selection_set(idx + 1)
def calculate_addresses(self):
addr = 0
lines = []
for idx, block in enumerate(self.blocks):
t = block["type"]
c = block["count"]
if t in ["Float", "4 bytes"]:
length = 2
total_length = c * length
elif t == "2 byte":
length = 1
total_length = c * length
elif t == "8 bit":
total_length = (c + 1) // 2
else:
messagebox.showerror("Ошибка", f"Неизвестный тип блока: {t}")
return
start_block = addr
end_block = addr + total_length - 1
lines.append(f"{idx + 1}. {t} ({c} шт.): от регистра {start_block} до {end_block}")
if t in ["Float", "2 byte", "4 bytes"]:
for i in range(c):
start_el = addr + i * length
end_el = start_el + length - 1
if length == 1:
lines.append(f" Элемент {i + 1}: регистр {start_el}")
else:
lines.append(f" Элемент {i + 1}: регистры {start_el} - {end_el}")
elif t == "8 bit":
for i in range(c):
reg = addr + i // 2
bit_pos = (i % 2) * 8
bit_addresses = [reg * 16 + bit_pos + b for b in range(8)]
bit_addresses_str = ", ".join(str(b) for b in bit_addresses)
lines.append(f" Элемент {i + 1}: регистр {reg}, биты {bit_pos}-{bit_pos + 7} → битовые адреса [{bit_addresses_str}]")
addr = end_block + 1
if lines:
lines.append(f"\nИтоговый конечный адрес регистра: {addr - 1}")
else:
lines.append("Список блоков пуст")
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, "\n".join(lines))
def load_exp_file(self):
filepath = filedialog.askopenfilename(
title="Выберите файл .EXP",
filetypes=[("EXP files", "*.exp"), ("Все файлы", "*.*")]
)
if not filepath:
return
blocks_from_file = self.parse_exp_modules(filepath)
if blocks_from_file:
self.blocks = []
for count, block_type in blocks_from_file:
self.blocks.append({"type": block_type, "count": count})
self.refresh_tree()
messagebox.showinfo("Готово", f"Загружено {len(blocks_from_file)} блоков из файла.")
else:
messagebox.showwarning("Внимание", "Не удалось найти подходящие блоки в файле.")
def parse_exp_modules(self, filename):
results = []
count = 0
prev_module = None
module_aliases = {
'float': 'Float',
'2 byte': '2 byte',
'8 bits': '8 bit',
'4 byte': '4 bytes' # поддержка _MODULE_NAME: '4 byte'
}
encodings = ['utf-8', 'cp1251', 'latin1']
for enc in encodings:
try:
with open(filename, 'r', encoding=enc) as f:
for line in f:
line = line.strip()
if line.startswith("_MODULE_NAME:"):
start = line.find("'")
end = line.rfind("'")
if start != -1 and end != -1 and end > start:
raw = line[start + 1:end].strip().lower()
block_type = module_aliases.get(raw)
if not block_type:
if prev_module is not None:
results.append((count, prev_module))
prev_module = None
count = 0
continue
if block_type == prev_module:
count += 1
else:
if prev_module is not None:
results.append((count, prev_module))
prev_module = block_type
count = 1
if prev_module is not None:
results.append((count, prev_module))
break
except Exception:
continue
return results
if __name__ == "__main__":
app = ModbusAddressCalculatorOrder()
app.mainloop()
Добрый день, подскажите пожалуйста вот такой момент.
Если я добавлю в модбас fix еще 1 адрес , то у меня все адреса что ниже сдвинуться? Или то что я добавляю в модбаск fix на адресацию не повлияет.
Вложение 85038
Имею контроллер ОВЕН ПЛК 110-60 и среду программирования CoDeSys V2.3. Настройка фильтров входных сигналов распространяется на все входы (кроме быстрых)? У быстрых своя настройка. Или можно настраивать индивидуально каждую группу из 8 входов Discrete inputs[FIX] AT %IB.0, AT %IB.1, AT %IB.2 и AT %IB.3? Я что-то не нашел индивидуальную настройку для AT %IB.0, AT %IB.1, AT %IB.2 и AT %IB.3.
Добрый день, подскажите бредмаузер может блокировать связь между онлайн симулятором панели weintek и codesys 2.5 режиме эмуляции. Раньше все работало , теперь нет
Спасибо, мне казалось что и так может тоже;)
Подскажите еще пожалуйста вот такой момент, разбираюсь в чужом проекте Вложение 85317 Вложение 85318
Кнопка включения ПВС на панели имеет адрес 0x44, как я понял ведь должен быть адрес 3x0:05 (ON_OFF_PVS_FUG)
ПВС вообще не работает и я вот не пойму проблема в неправильном адресе кнопки или вообще программный блок не полный Вложение 85319 Вложение 85320 Вложение 85324
Как я понял MAN_Regulator это ручной ввод(оно нам не интересно) , а нас интересует AUTO_MAN атематическое регулирование? а ON_OFF_PVS_FUG это сброс регулятора и разрешение работы.
И мне нужно включить AUTO_MAN и ON_OFF_PVS_FUG
Вложение 85322 проект плк
Вложение 85323 проект панели
Обновил программу для подсчета адресов из конфигурации плк теперь считает как 3x , и так же пересчитывает в 0x
Код:import tkinter as tk
from tkinter import ttk, messagebox, filedialog
class ModbusAddressCalculatorOrder(tk.Tk):
def __init__(self):
super().__init__()
self.title("Калькулятор адресов")
self.geometry("750x700")
self.resizable(True, True)
self.blocks = []
self.create_widgets()
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
self.rowconfigure(3, weight=1)
self.rowconfigure(6, weight=1)
def create_widgets(self):
padding = {'padx': 10, 'pady': 5}
ttk.Label(self, text="Тип блока:").grid(column=0, row=0, sticky="w", **padding)
self.type_var = tk.StringVar()
self.type_combo = ttk.Combobox(self, textvariable=self.type_var,
values=["Float", "2 byte", "8 bit", "4 bytes"], state="readonly")
self.type_combo.grid(column=1, row=0, sticky="ew", **padding)
self.type_combo.current(0)
ttk.Label(self, text="Количество:").grid(column=0, row=1, sticky="w", **padding)
self.count_entry = ttk.Entry(self)
self.count_entry.grid(column=1, row=1, sticky="ew", **padding)
self.count_entry.insert(0, "1")
self.btn_add = ttk.Button(self, text="Добавить блок", command=self.add_block)
self.btn_add.grid(column=0, row=2, columnspan=2, pady=10, sticky="ew")
# Галочка для пересчета адресов в 0x
self.use_hex_var = tk.BooleanVar(value=False)
self.chk_hex = ttk.Checkbutton(self, text="Показывать адреса в 0x", variable=self.use_hex_var)
self.chk_hex.grid(column=0, row=2, columnspan=2, sticky="e", padx=10)
self.btn_load_exp = ttk.Button(self, text="Загрузить .EXP", command=self.load_exp_file)
self.btn_load_exp.grid(column=0, row=7, columnspan=2, pady=10, sticky="ew")
tree_frame = ttk.Frame(self)
tree_frame.grid(column=0, row=3, columnspan=2, sticky="nsew", padx=10, pady=5)
tree_frame.columnconfigure(0, weight=1)
tree_frame.rowconfigure(0, weight=1)
self.tree = ttk.Treeview(tree_frame, columns=("Тип", "Количество"), show="headings")
self.tree.heading("Тип", text="Тип блока")
self.tree.heading("Количество", text="Количество")
self.tree.column("Тип", width=250)
self.tree.column("Количество", width=100)
self.tree.grid(column=0, row=0, sticky="nsew")
tree_scrollbar = ttk.Scrollbar(tree_frame, orient="vertical", command=self.tree.yview)
tree_scrollbar.grid(column=1, row=0, sticky="ns")
self.tree.configure(yscrollcommand=tree_scrollbar.set)
btn_frame = ttk.Frame(self)
btn_frame.grid(column=0, row=4, columnspan=2, pady=10, sticky="ew")
btn_frame.columnconfigure((0, 1, 2), weight=1)
ttk.Button(btn_frame, text="Удалить блок", command=self.delete_block).grid(column=0, row=0, padx=5, sticky="ew")
ttk.Button(btn_frame, text="Вверх", command=self.move_up).grid(column=1, row=0, padx=5, sticky="ew")
ttk.Button(btn_frame, text="Вниз", command=self.move_down).grid(column=2, row=0, padx=5, sticky="ew")
self.btn_calc = ttk.Button(self, text="Рассчитать адреса", command=self.calculate_addresses)
self.btn_calc.grid(column=0, row=5, columnspan=2, pady=10, sticky="ew")
self.text_frame = ttk.Frame(self)
self.text_frame.grid(column=0, row=6, columnspan=2, sticky="nsew", padx=10, pady=5)
self.text_frame.columnconfigure(0, weight=1)
self.text_frame.rowconfigure(0, weight=1)
self.result_text = tk.Text(self.text_frame, wrap="none", font=("Consolas", 10))
self.result_text.grid(column=0, row=0, sticky="nsew")
self.scrollbar_v = ttk.Scrollbar(self.text_frame, orient="vertical", command=self.result_text.yview)
self.scrollbar_v.grid(column=1, row=0, sticky="ns")
self.result_text.configure(yscrollcommand=self.scrollbar_v.set)
self.scrollbar_h = ttk.Scrollbar(self.text_frame, orient="horizontal", command=self.result_text.xview)
self.scrollbar_h.grid(column=0, row=1, sticky="ew")
self.result_text.configure(xscrollcommand=self.scrollbar_h.set)
self.result_text.config(state="normal")
def add_block(self):
t = self.type_var.get()
c = self.count_entry.get()
try:
c = int(c)
if c <= 0:
raise ValueError
except ValueError:
messagebox.showerror("Ошибка", "Введите корректное положительное число для количества!")
return
self.blocks.append({"type": t, "count": c})
self.refresh_tree()
def refresh_tree(self):
self.tree.delete(*self.tree.get_children())
for idx, block in enumerate(self.blocks):
self.tree.insert("", "end", iid=idx, values=(block["type"], block["count"]))
def delete_block(self):
selected = self.tree.selection()
if not selected:
messagebox.showinfo("Информация", "Выберите блок для удаления.")
return
idx = int(selected[0])
del self.blocks[idx]
self.refresh_tree()
def move_up(self):
selected = self.tree.selection()
if not selected:
messagebox.showinfo("Информация", "Выберите блок для перемещения.")
return
idx = int(selected[0])
if idx == 0:
return
self.blocks[idx], self.blocks[idx - 1] = self.blocks[idx - 1], self.blocks[idx]
self.refresh_tree()
self.tree.selection_set(idx - 1)
def move_down(self):
selected = self.tree.selection()
if not selected:
messagebox.showinfo("Информация", "Выберите блок для перемещения.")
return
idx = int(selected[0])
if idx == len(self.blocks) - 1:
return
self.blocks[idx], self.blocks[idx + 1] = self.blocks[idx + 1], self.blocks[idx]
self.refresh_tree()
self.tree.selection_set(idx + 1)
def calculate_addresses(self):
addr = 0
lines = []
use_hex = self.use_hex_var.get() # галочка для hex
def fmt_reg(r):
return f"0x{r:02X}" if use_hex else f"3x{r}"
for idx, block in enumerate(self.blocks):
t = block["type"]
c = block["count"]
if t in ["Float", "4 bytes"]:
length = 2
total_length = c * length
elif t == "2 byte":
length = 1
total_length = c * length
elif t == "8 bit":
total_length = (c + 1) // 2
else:
messagebox.showerror("Ошибка", f"Неизвестный тип блока: {t}")
return
start_block = addr
end_block = addr + total_length - 1
lines.append(f"{idx + 1}. {t} ({c} шт.): от регистра {fmt_reg(start_block)} до {fmt_reg(end_block)}")
if t in ["Float", "2 byte", "4 bytes"]:
for i in range(c):
start_el = addr + i * length
end_el = start_el + length - 1
if length == 1:
lines.append(f" Элемент {i + 1}: регистр {fmt_reg(start_el)}")
else:
lines.append(f" Элемент {i + 1}: регистры {fmt_reg(start_el)} - {fmt_reg(end_el)}")
elif t == "8 bit":
for i in range(c):
reg = addr + i // 2
bit_pos = (i % 2) * 8
bit_addresses = [reg * 16 + bit_pos + b for b in range(8)]
bit_addresses_str = ", ".join(fmt_reg(b) for b in bit_addresses)
lines.append(f" Элемент {i + 1}: регистр {fmt_reg(reg)}, биты {bit_pos}-{bit_pos + 7} → битовые адреса [{bit_addresses_str}]")
addr = end_block + 1
if lines:
lines.append(f"\nИтоговый конечный адрес регистра: {fmt_reg(addr - 1)}")
else:
lines.append("Список блоков пуст")
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, "\n".join(lines))
def load_exp_file(self):
filepath = filedialog.askopenfilename(
title="Выберите файл .EXP",
filetypes=[("EXP files", "*.exp"), ("Все файлы", "*.*")]
)
if not filepath:
return
blocks_from_file = self.parse_exp_modules(filepath)
if blocks_from_file:
self.blocks = []
for count, block_type in blocks_from_file:
self.blocks.append({"type": block_type, "count": count})
self.refresh_tree()
messagebox.showinfo("Готово", f"Загружено {len(blocks_from_file)} блоков из файла.")
else:
messagebox.showwarning("Внимание", "Не удалось найти подходящие блоки в файле.")
def parse_exp_modules(self, filename):
results = []
count = 0
prev_module = None
module_aliases = {
'float': 'Float',
'2 byte': '2 byte',
'8 bits': '8 bit',
'4 byte': '4 bytes'
}
encodings = ['utf-8', 'cp1251', 'latin1']
for enc in encodings:
try:
with open(filename, 'r', encoding=enc) as f:
for line in f:
line = line.strip()
if line.startswith("_MODULE_NAME:"):
start = line.find("'")
end = line.rfind("'")
if start != -1 and end != -1 and end > start:
raw = line[start + 1:end].strip().lower()
block_type = module_aliases.get(raw)
if not block_type:
if prev_module is not None:
results.append((count, prev_module))
prev_module = None
count = 0
continue
if block_type == prev_module:
count += 1
else:
if prev_module is not None:
results.append((count, prev_module))
prev_module = block_type
count = 1
if prev_module is not None:
results.append((count, prev_module))
break
except Exception:
continue
return results
if __name__ == "__main__":
app = ModbusAddressCalculatorOrder()
app.mainloop()
Вложение 85325 Вложение 85326
У вас все адреса не правильные, и посчитали вы не правильно. Читайте предыдущую страницу.
Разберитесь сначала с адресами и функциями, проверьте в работе.
0х - это запись и чтение бит,
44 - номер бита, попадает в регистр 2 бит 12 ( 2*16+12=44 ),
4х -чтение и запись регистров, 4х_Bit (Доступ к битам в регистре) адрес 2 бит 12 Вложение 85327
ну как так то?:eek: почему не правильно посчитал, все остальные адреса работают и совпадают , на предыдущей станице тоже все адреса пересчитал прописал и все заработало
Проекты не мои и все работает на 3x и 0x адресах (вообще не видел 4x адресов)
вот берем конфигурацию плк Вложение 85329
первые 2шт 8bits у нас получается
8 bit (2 шт.)
Элемент 1: регистр 0, биты 0-7 → битовые адреса [0, 1, 2, 3, 4, 5, 6, 7]
Элемент 2: регистр 0, биты 8-15 → битовые адреса [8, 9, 10, 11, 12, 13, 14, 15]
или
8 bit (2 шт.)
Элемент 1: регистр 3x0, биты 0-7 → битовые адреса [3x0, 3x1, 3x2, 3x3, 3x4, 3x5, 3x6, 3x7]
Элемент 2: регистр 3x0, биты 8-15 → битовые адреса [3x8, 3x9, 3x10, 3x11, 3x12, 3x13, 3x14, 3x15]
или
8 bit (2 шт.)
Элемент 1: регистр 0x00, биты 0-7 → битовые адреса [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]
Элемент 2: регистр 0x00, биты 8-15 → битовые адреса [0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F]
разве нет?
1х - только чтение бит,
0х - запись и чтение бит,
3х - только чтение регистров, 3х_Bit - только чтение бит в регистре,
4х- запись и чтение регистров, 4х_Bit - запись и чтение бит в регистре,
Здравствуйте у меня невозможно добавить во вкладку ресурсы никакие объекты. ПЛК110-32
помогите что я делаю не так?
есть простой проект, я создал фб и в него не поступают данные. почему?
соответственно и на выходе с него ничего не работает.
я гдето не так объявляю переменные?
передачи по сетям работают нормально
Вложение 85454
Вложение 85453
Алекс_инд
Переменной i3 внутри ФБ нигде не присваивается никакого значения. По умолчанию оно будет равно нулю, поэтому условие в ФБ не выполняется.
у вас сделан ФБ с двумя входами И1 И2 и одним выходом О1
что вы в программе подаёте на вход И2?
а что вы делаете и с какой переменной внутри ФБ?Цитата:
соответственно и на выходе с него ничего не работает.
а что вы хотите сделать?Цитата:
что я делаю не так?
вы неправильно создали ФБ и алгоритм внутри ФБЦитата:
я гдето не так объявляю переменные?
вы неправильно использовали ФБ в основном коде программы
Чтобы посмотреть, как работает ФБ, надо вызвать его экземпляр, дважды щёлкнуть по ФБ в дереве, выбрать нужный экземпляр и нажать ОК Вложение 85471
И как уже сказали I3 в IF надо изменить, например на I1
спасибо заработало/
я не знал что надо Т4 в поу еще раз выбрать.
меня вот это смущало при нажатии f5. я ж не знал.....
Вложение 85474
про и3 это и так понятно было.
я на овены перешел месяц назад. до этого я 25 лет кодил 8032 авр пик и стм32. на маш кодах, асме и си. и в кодесисе я пока не могу привыкнуть что место объявления переменных влияет что они то передают значения то нет. вернее непривычно глобальные объявляются
вот так передает
Вложение 85472
а вот так нет
Вложение 85473
понятно что локальные глобальные (volatile которые в си) локальная сильнее глобальной.....
непривычно короче.
короче ассемблер и си рулят. а это какая то мешанина асма си паскаля бейсика......двоеточия, энды какието везде.....
ну тык я с реле и принимаю аналоговый сигнал. а блок питания его подает.
у меня натурные испытания. живые так сказать.
я сразу все типы приборов и сетей запустил - 485 от пр102, на экран через езернет, в клауд и в приложение тоже все доходит - там оплатил 200 рублей.
пр102 дешевле чем модуль расширения))))
с электроникой то все понятно - поэтому все сети я освоил за полчаса, чуднО как среда программирования работает.
Вложение 85475
вобщем спасибо. дьявол в мелочах
Цитата:
я ж не знал.....
сам создал проблему и сам решил? :DЦитата:
про и3 это и так понятно было.
ну тогда должн быть знакома абревиатура RTFMЦитата:
я на овены перешел месяц назад. до этого я 25 лет кодил 8032 авр пик и стм32. на маш кодах, асме и си.
Вложение 85476что там такого? выбрал класс оно само всё сделаетЦитата:
и в кодесисе я пока не могу привыкнуть что место объявления переменных влияет что они то передают значения то нет. вернее непривычно глобальные объявляются
основная проблема была в том что я не знал как смотреть показания внутренних переменных блока.
rtfm это обычно линукс) а не мануал)) да и мануалов тысячи страниц - пока все прочтешь уже все проекты уйдут.
господа)) нужна бригада))
как работает логический элемент И??))
когда на оба входа подано 1 на выходе тоже 1. ну как бы с 12 лет знаю.
но в плк чтото там явно с циклами плк подмешивается.
подскажите как решить?
подаю на счетчик через этот самый и такты 0,5 секунды. пока на нижнем входе 1 то счетчик верно считает +1 каждые 2 секунды.
когда на нижний вход подаю 0(false) то счетчик за секунду насчитывает 1000.
что я делаю не так и почему так?
я даже свой и создал на ст как фб - итог тот же
надо отключать счетчик.
Вложение 85654
Вложение 85655
Обновить порядок, попробовать снова.
Я тут в ночИ заглянул. Могу ошибаться или советоваь не то :)
1. Поставь Автоматический порядок выполнения
2. ПРоверь, не заезжает ли где память друг на друга
3. Выложи проект
(Иду спать)
порядок выполнения через задницу, плк не знает что ему делать
Ну конкретно здесь с порядком все норм, за исключением того, что с счётчика забирается то, что в ОЛ обзывается спецназванием "задержкой на цикл", а здесь просто забирается результат прошлого прогона счётчика.
С “и" на картинках все норм. Блинк в работе и там и там.
Касаемо порядка - в рамках картинок проблем нет
Вот проблема с "и". Из-за порядка
Вложение 85662
Что внутри самопального фб - знает только автор. Даже если он что рассказывал - это не описание работы, а описание хотелки как должно работать. Так же никто кроме автора не знает что вокруг картинок.
И вообще - на что жалуемся? На какой “и"?
Пункт 3 из ответа Cs-Cs самый верный ответ здесь
самый просто И
Вложение 85669
Ну и? Т.к вы знаете с 12 лет как работает "И" и после
я предположу (но это не точно!) что вы пишите прям из-за стола задув свечи. Поздравляю вас с 12-летием.Цитата:
IF a AND b THEN x:=TRUE; ELSE x:=FALSE;
END_IF;
Без обид:
x := a AND b;
По делу.
За пределами ваших картинок подтвердилось что вы таки накуролесили с порядком (выше картинок). Но опять же, не факт что именно порядок - проблема.
Зачем-то вызываете счетчик 2 раза. Это само по себе нормально, но анализировать условия вызовов учитывая еще и порядок - у меня нет времени.
Если с ходу - счетчик будет тикать как минимум всегда (по блинку) если в его 2й вызов будет всегда залетать FALSE
--
ловите лайфхак
А в поле кода оторвите и выкиньте квадраты к блинку.Код:bl1: BLINK := (ENABLE := TRUE, TIMELOW := T#1s, TIMEHIGH := T#1s);
Абсолютно тоже самое, но сможете прям находу экспериментить с блинком не думая что забудете что-то вернуть назад. Просто тырк-пырк питание и всё вернулось.
стер второй счетчик - заработало как надо.
как мне грамотно еще несколько счетчиков вставить в другие процессы в этом проекте?
не привык я к этой среде. в кеиле пишется a&b=x.Цитата:
я предположу (но это не точно!) что вы пишите прям из-за стола задув свечи. Поздравляю вас с 12-летием.
Без обид:
x := a AND b;
это где в каком окне такое написать?Цитата:
ловите лайфхак
Мой расчетный счет ...
Верхнему столику повторите пожалуста
Привыкайте. В си вообще x=a&&b или x=a&b в зависимости от того что хотите. Т.е еще и хотеть правильно нужно.
(хотя кому я это? Извините, не увидел где-то ранее - "от машинных кодов до си99")
Про кеил не слышал, но смысл понятен и понял почему вы здесь с квадратиков начали.
Выше, в объявлениях же
Вложение 85680Цитата:
bl1: BLINK ...