master-sf1.0

This commit is contained in:
qihao.gong@jikimo.com
2023-05-06 16:03:00 +08:00
parent fcf0354a1e
commit 0077d97cfa
307 changed files with 20636 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
from . import ftp_client
from . import ftp_operate
from . import py2opcua

View File

@@ -0,0 +1,487 @@
# -*- coding: utf-8 -*-
import base64
import logging
import os
import json
import hashlib
import time
import requests
from datetime import datetime, timedelta
from odoo import fields, models, api, _
from odoo.exceptions import ValidationError
from odoo.exceptions import UserError
from odoo.addons.sf_machine_connect.models import py2opcua, ftp_operate
_logger = logging.getLogger(__name__)
# ----------------------------------------------------------
# Models for client
# ----------------------------------------------------------
class FtpButton(models.Model):
_inherit = 'sf.cnc.processing'
user_permissions = fields.Boolean(string='权限', related='workorder_id.user_permissions')
state = fields.Selection(string='状态', related='workorder_id.state')
@api.onchange('users_ids')
def get_user_permissions(self):
uid = self.env.uid
for workorder in self:
if workorder.users_ids:
list_user_id = []
for item in workorder.users_ids:
list_user_id.append(item.id)
if uid in list_user_id:
workorder.user_permissions = True
else:
workorder.user_permissions = False
else:
workorder.user_permissions = False
def up(self):
"""
此函数用于将NC代码下发到机床
:return:
"""
# 点击下发按钮自动补偿三元检测偏差值
try:
try:
if self.sequence_number == '1':
self.check_compensation_before_up()
except Exception:
raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态")
# host="192.168.2.158", port=8080, username="MITSUBISHI", password="CNC"
host = self.workorder_id.workcenter_id.machine_tool_id.ftp_host
port = self.workorder_id.workcenter_id.machine_tool_id.ftp_port
username = self.workorder_id.workcenter_id.machine_tool_id.ftp_num
pwd = self.workorder_id.workcenter_id.machine_tool_id.ftp_pwd
remote_path = self.workorder_id.workcenter_id.machine_tool_id.ftp_remote_path
print(host, port, username, pwd, remote_path)
ftp = ftp_operate.FtpController(host, port, username, pwd)
# ftp.delAllfile('C://Users//马广威//Desktop//ftp')
a = self.cnc_id
datas = base64.standard_b64decode(a.datas)
# file_path = '{}\{}\{}'.format(a._filestore(), a.store_fname.split('/'[0]), a.display_name)
file_path_local = '{}/{}'.format('/nc2machine', a.display_name)
# file_path_remote = '{}\{}'.format('//M80(192,168,2,142)//DS', a.display_name)
file_path_remote = '{}\{}'.format(remote_path, a.display_name)
with open(file_path_local, mode='wb+') as file:
file.write(datas)
# 存在本地的文件下发到机床
ftp.upload_file(remotepath=file_path_remote, localpath=file_path_local)
_logger.info("======%s下发成功======" % a.display_name)
ftp.close_ftp()
up_time = str(datetime.now() + timedelta(hours=8))
self.env['delivery.record'].create({
'workorder_id': self.workorder_id.id,
'delivery_type': '单个下发',
'delivery_time': up_time,
'influence_record': self.sequence_number,
})
# self.workorder_id.delivery_records.sudo().create({
# 'delivery_type': '单个下发',
# 'delivery_time': 'up_time',
# 'influence_record': 'self.sequence_number',
# })
except Exception as e:
_logger.info("=====================================", e)
raise UserError('NC下发执行超时, 请检查下发状态')
# 补偿下发都执行完毕后按钮标志位变为true
self.button_state = True
def check_compensation_before_up(self):
"""
下发NC代码前自动补偿三元检测偏差值
:return:
"""
hongbianliang550 = self.workorder_id.workcenter_id.machine_tool_id.x_compensation_node
hongbianliang551 = self.workorder_id.workcenter_id.machine_tool_id.y_compensation_node
try:
temp_dict = {}
temp_dict[hongbianliang550] = self.workorder_id.compensation_value_x
temp_dict[hongbianliang551] = self.workorder_id.compensation_value_y
temp = py2opcua.Py2opcua()
temp.write(temp_dict)
except Exception as e:
_logger.info("=====================================", e)
raise UserError('补偿值获取失败,或机床未连接,请检查')
class Machine_ftp(models.Model):
"""
数据采集类
"""
_inherit = 'sf.machine_tool'
workorder_ids = fields.One2many('mrp.workorder', 'machine_tool_id', string='工单')
# 机床配置项目
# ftp相关
ftp_num = fields.Char('ftp账号')
ftp_pwd = fields.Char('ftp密码')
ftp_host = fields.Char('ftp地址')
ftp_port = fields.Integer('ftp端口')
ftp_remote_path = fields.Char('机床ftp路径')
# 补偿值写入相关
x_compensation_node = fields.Char('x补偿值节点')
y_compensation_node = fields.Char('y补偿值节点')
# 数采配置相关
machine_ip = fields.Char('机床IP')
machine_signed = fields.Char('机床刷新间隔')
machine_status = fields.Char('机床在线状态')
machine_cnc_type = fields.Char('机床CNC型号')
machine_axis_count = fields.Char('机床轴总数')
machine_run_status = fields.Char('机床运行状态')
machine_emg_status = fields.Char('机床急停状态')
machine_cut_status = fields.Char('机床当前切削状态')
machine_mode = fields.Char('机床当前操作模式')
machine_spindle_load = fields.Char('机床主轴负载')
machine_x_mach = fields.Char('机床X轴机械坐标')
machine_x_abs_mach = fields.Char('机床X轴当前位置')
machine_x_rel_mach = fields.Char('机床X轴相对工件坐标')
machine_x_dis_mach = fields.Char('机床X轴目标距离')
machine_x_axis_load = fields.Char('机床X轴伺服轴负载')
machine_y_mach = fields.Char('机床Y轴机械坐标')
machine_y_abs_mach = fields.Char('机床Y轴当前位置')
machine_y_rel_mach = fields.Char('机床Y轴相对工件坐标')
machine_y_dis_mach = fields.Char('机床Y轴目标距离')
machine_y_axis_load = fields.Char('机床Y轴伺服轴负载')
machine_z_mach = fields.Char('机床Z轴机械坐标')
machine_z_abs_mach = fields.Char('机床Z轴当前位置')
machine_z_rel_mach = fields.Char('机床Z轴相对工件坐标')
machine_z_dis_mach = fields.Char('机床Z轴目标距离')
machine_z_axis_load = fields.Char('机床Z轴伺服轴负载')
machine_tool_num = fields.Char('机床当前刀位号')
machine_program = fields.Char('机床主程序名称')
machine_current_prg = fields.Char('机床当前执行指令')
machine_prg_seq = fields.Char('机床当前执行语句号')
machine_spindle_speed_set = fields.Char('机床设定主轴速度')
machine_act_spindle_speed = fields.Char('机床实际主轴转速')
machine_feed_speed_set = fields.Char('机床设定进给速度')
machine_act_feed_speed = fields.Char('机床实际进给速度')
machine_spindle_feed = fields.Char('机床主轴倍率')
machine_feed_rate = fields.Char('机床进给倍率')
machine_rapid_feed = fields.Char('机床快速移动倍率')
machine_run_time = fields.Char('机床运行时间')
machine_cut_time = fields.Char('机床切削时间')
machine_keep_alive_time = fields.Char('机床上电时间')
machine_circle_time = fields.Char('机床循环时间')
machine_product_counts = fields.Char('机床加工件数')
machine_system_date = fields.Char('机床系统日期')
machine_system_time = fields.Char('机床系统时间')
machine_alarm_msg = fields.Char('机床系统报警')
# 机床采集项目
timestamp = fields.Datetime('时间戳', readonly=True)
signed = fields.Integer('刷新间隔', readonly=True)
status = fields.Boolean('在线状态', readonly=True)
time_on = fields.Char('总在线时长', readonly=True)
time_on_now = fields.Char('本次在线时长', readonly=True)
tool_num = fields.Integer('当前刀具', readonly=True)
program = fields.Char('当前程序', readonly=True)
run_status = fields.Selection([('0', '空闲中'), ('1', '加工中'), ('2', '加工中'), ('3', '加工中')], string='运行状态',
readonly=True, default='0')
run_time = fields.Char('总运行时长', readonly=True)
cut_time = fields.Char('总切削时长', readonly=True)
cut_status = fields.Selection([('0', '未切削'), ('1', '切削中'), ('2', '切削中'), ('3', '切削中')], string='切削状态',
readonly=True, default='0')
spindle_speed = fields.Char('主轴转速', readonly=True)
tool_num_process_time1 = fields.Char('刀位1', readonly=True, default='0')
tool_num_process_time2 = fields.Char('刀位2', readonly=True, default='0')
tool_num_process_time3 = fields.Char('刀位3', readonly=True, default='0')
tool_num_process_time4 = fields.Char('刀位4', readonly=True, default='0')
tool_num_process_time5 = fields.Char('刀位5', readonly=True, default='0')
tool_num_process_time6 = fields.Char('刀位6', readonly=True, default='0')
tool_num_process_time7 = fields.Char('刀位7', readonly=True, default='0')
tool_num_process_time8 = fields.Char('刀位8', readonly=True, default='0')
tool_num_process_time9 = fields.Char('刀位9', readonly=True, default='0')
tool_num_process_time10 = fields.Char('刀位10', readonly=True, default='0')
tool_num_process_time11 = fields.Char('刀位11', readonly=True, default='0')
tool_num_process_time12 = fields.Char('刀位12', readonly=True, default='0')
tool_num_process_time13 = fields.Char('刀位13', readonly=True, default='0')
tool_num_process_time14 = fields.Char('刀位14', readonly=True, default='0')
tool_num_process_time15 = fields.Char('刀位15', readonly=True, default='0')
tool_num_process_time16 = fields.Char('刀位16', readonly=True, default='0')
tool_num_process_time17 = fields.Char('刀位17', readonly=True, default='0')
tool_num_process_time18 = fields.Char('刀位18', readonly=True, default='0')
tool_num_process_time19 = fields.Char('刀位19', readonly=True, default='0')
tool_num_process_time20 = fields.Char('刀位20', readonly=True, default='0')
tool_num_process_time21 = fields.Char('刀位21', readonly=True, default='0')
tool_num_process_time22 = fields.Char('刀位22', readonly=True, default='0')
tool_num_process_time23 = fields.Char('刀位23', readonly=True, default='0')
tool_num_process_time24 = fields.Char('刀位24', readonly=True, default='0')
class WorkCenterBarcode(models.Model):
"""
扫码托盘码可查到制造订单,由制造订单查工单
"""
_inherit = "mrp.workorder"
compensation_value_x = fields.Float(string='X轴补偿值')
compensation_value_y = fields.Float(string='Y轴补偿值')
button_compensation_state = fields.Boolean(string='是否已经补偿', readonly=True)
button_up_all_state = fields.Boolean(string='是否已经全部下发', readonly=True)
machine_tool_id = fields.Many2one('sf.machine_tool', string='机床')
machine_tool_name = fields.Char(string='机床名称', default='未知机床', compute='_run_info', readonly=True)
machine_tool_type_id = fields.Char(string='机床型号', default='未知型号', compute='_run_info', readonly=True)
machine_tool_status = fields.Boolean(string='在线状态', compute='_run_info', readonly=True)
machine_tool_run_status = fields.Selection([('0', '空闲中'), ('1', '加工中'), ('2', '加工中'), ('3', '加工中')],
string='运行状态', compute='_run_info', readonly=True, default='0')
machine_tool_timestamp = fields.Datetime('时间戳', compute='_run_info', readonly=True)
machine_tool_time_on = fields.Char('总在线时长', compute='_run_info', readonly=True)
machine_tool_time_on_now = fields.Char('本次在线时长', compute='_run_info', readonly=True)
machine_tool_tool_num = fields.Integer('当前刀具', compute='_run_info', readonly=True)
machine_tool_program = fields.Char('当前程序', compute='_run_info', readonly=True)
machine_tool_machine_ip = fields.Char('机床IP', compute='_run_info', readonly=True)
machine_tool_cut_status = fields.Selection([('0', '未切削'), ('1', '切削中'), ('2', '切削中'), ('3', '切削中')],
string='切削状态', compute='_run_info', readonly=True, default='0')
machine_tool_compensation_value_x = fields.Char('x补偿值', compute='_run_info', readonly=True)
machine_tool_compensation_value_y = fields.Char('y补偿值', compute='_run_info', readonly=True)
delivery_records = fields.One2many('delivery.record', 'workorder_id', string="下发记录")
@api.depends('workcenter_id.machine_tool_id.timestamp')
def _run_info(self):
# self.machine_tool_name = '1号机床'
self.machine_tool_name = self.workcenter_id.machine_tool_id.name
self.machine_tool_type_id = self.workcenter_id.machine_tool_id.type_id.name
self.machine_tool_status = self.workcenter_id.machine_tool_id.status
self.machine_tool_run_status = self.workcenter_id.machine_tool_id.run_status
self.machine_tool_timestamp = self.workcenter_id.machine_tool_id.timestamp
self.machine_tool_time_on = self.workcenter_id.machine_tool_id.time_on
self.machine_tool_time_on_now = self.workcenter_id.machine_tool_id.time_on_now
self.machine_tool_tool_num = self.workcenter_id.machine_tool_id.tool_num
self.machine_tool_program = self.workcenter_id.machine_tool_id.program
self.machine_tool_machine_ip = self.workcenter_id.machine_tool_id.machine_ip
self.machine_tool_cut_status = self.workcenter_id.machine_tool_id.cut_status
self.machine_tool_compensation_value_x = self.compensation_value_x
self.machine_tool_compensation_value_y = self.compensation_value_y
def compensation(self):
hongbianliang550 = self.workcenter_id.machine_tool_id.x_compensation_node
hongbianliang551 = self.workcenter_id.machine_tool_id.y_compensation_node
try:
temp_dict = {}
temp_dict[hongbianliang550] = self.compensation_value_x
temp_dict[hongbianliang551] = self.compensation_value_y
print(temp_dict)
temp = py2opcua.Py2opcua()
_logger.info("====================2===============%s" % temp_dict)
temp.write(temp_dict)
_logger.info("================补偿完成==============")
except Exception as e:
_logger.info("=====================================", e)
raise UserError('补偿值获取失败,或机床未连接,请检查')
# 补偿执行完毕后按钮标志位变为true
self.button_compensation_state = True
def up_all(self):
"""
此函数用于将NC代码全部下发到机床
:return:
"""
# 一键下发前删除机床上的全部程序
try:
filepath = '/nc2machine'
del_list = os.listdir(filepath)
_logger.info("=====================================%s" % del_list)
for f in del_list:
file_path = os.path.join(filepath, f)
if os.path.isfile(file_path):
os.remove(file_path)
except Exception as e:
_logger.info("=====================================", e)
raise UserError('程序删除失败,请重试')
# host="192.168.2.158", port=8080, username="MITSUBISHI", password="CNC"
try:
self.compensation()
except Exception:
raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态")
sequence_collect = []
host = self.workcenter_id.machine_tool_id.ftp_host
port = self.workcenter_id.machine_tool_id.ftp_port
username = self.workcenter_id.machine_tool_id.ftp_num
pwd = self.workcenter_id.machine_tool_id.ftp_pwd
remote_path = self.workcenter_id.machine_tool_id.ftp_remote_path
_logger.info("=====================1666666661111================%s,%s,%s,%s" % (host, port, username, pwd))
ftp = ftp_operate.FtpController(host, port, username, pwd)
_logger.info("=====================1777777777111================")
try:
for item in self.cnc_ids:
a = item.cnc_id
sequence_collect.append(item.sequence_number)
datas = base64.standard_b64decode(a.datas)
# file_path = '{}\{}\{}'.format(a._filestore(), a.store_fname.split('/'[0]), a.display_name)
file_path_local = '{}/{}'.format('/nc2machine', a.display_name)
# 本地测试一键下发
# file_path_local = '{}/{}'.format('D:\\jikimo', a.display_name)
# file_path_remote = '{}\{}'.format('//M80(192,168,2,142)//DS', a.display_name)
file_path_remote = '{}\{}'.format(remote_path, a.display_name)
with open(file_path_local, mode='wb+') as file:
file.write(datas)
# 存在本地的文件下发到机床
ftp.upload_file(remotepath=file_path_remote, localpath=file_path_local)
_logger.info("======%s下发成功======" % a.display_name)
item.button_state = True
ftp.close_ftp()
# 增加一键下发记录
up_time = str(datetime.now() + timedelta(hours=8))
sequence_str = ','.join(sequence_collect)
self.delivery_records.create({
'delivery_type': '一键下发',
'delivery_time': up_time,
'influence_record': sequence_str,
})
_logger.info("=====================22================")
except Exception as e:
_logger.info("=====================================", e)
raise UserError('NC下发执行超时, 请检查下发状态')
def up_merge_all(self):
"""
此函数用于将NC代码一键合并下发到机床
:return:
"""
# 一键合并下发前删除机床上的全部程序
try:
filepath = '/nc2machine'
del_list = os.listdir(filepath)
_logger.info("=====================================%s" % del_list)
for f in del_list:
file_path = os.path.join(filepath, f)
if os.path.isfile(file_path):
os.remove(file_path)
except Exception as e:
_logger.info("=====================================", e)
raise UserError('程序删除失败,请重试')
# host="192.168.2.158", port=8080, username="MITSUBISHI", password="CNC"
try:
self.compensation()
except Exception:
raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态")
sequence_collect = []
host = self.workcenter_id.machine_tool_id.ftp_host
port = self.workcenter_id.machine_tool_id.ftp_port
username = self.workcenter_id.machine_tool_id.ftp_num
pwd = self.workcenter_id.machine_tool_id.ftp_pwd
remote_path = self.workcenter_id.machine_tool_id.ftp_remote_path
_logger.info("=====================1666666661111================%s,%s,%s,%s" % (host, port, username, pwd))
ftp = ftp_operate.FtpController(host, port, username, pwd)
_logger.info("=====================1777777777111================")
file_path_local = ''
file_path_remote = ''
try:
# 给文件名
_logger.info('启动')
begin_name1 = self.cnc_ids[0].cnc_id.display_name.split('-')
_logger.info(begin_name1)
temp_name1 = begin_name1[-1].split('.')
final_name = '%s-ALL-MERGE.%s' % (begin_name1[0], temp_name1[-1])
_logger.info(final_name)
for item in self.cnc_ids:
a = item.cnc_id
sequence_collect.append(item.sequence_number)
datas = base64.standard_b64decode(a.datas)
# file_path = '{}\{}\{}'.format(a._filestore(), a.store_fname.split('/'[0]), a.display_name)
file_path_local = '{}/{}'.format('/nc2machine', final_name)
# 本地测试一键下发
# file_path_local = '{}/{}'.format('D:\\jikimo', a.display_name)
# file_path_remote = '{}\{}'.format('//M80(192,168,2,142)//DS', a.display_name)
file_path_remote = '{}\{}'.format(remote_path, final_name)
# 合并文件
with open(file_path_local, mode='ab+') as file:
file.write(datas)
item.button_state = True
_logger.info('========一键下发前合并成功===============')
# 去除合并文件中间部分的头尾
with open(file_path_local, mode='rb+') as f:
# _logger.info(f.read())
# content = f.read()
# _logger.info(content)
new_content = f.read().replace(b'\r\nM30\r\n%\r\n%\r\n', b'\r\n')
# _logger.info(new_content)
f.seek(0)
f.truncate()
f.write(new_content)
_logger.info('========二次合并成功===============')
# 存在本地的文件下发到机床
ftp.upload_file(remotepath=file_path_remote, localpath=file_path_local)
_logger.info("======%s一键合并下发成功======" % a.display_name)
ftp.close_ftp()
# 增加一键合并下发记录
up_time = str(datetime.now() + timedelta(hours=8))
sequence_str = ','.join(sequence_collect)
self.delivery_records.create({
'delivery_type': '一键合并下发',
'delivery_time': up_time,
'influence_record': sequence_str,
})
_logger.info("=====================22================")
except Exception as e:
for item in self.cnc_ids:
item.button_state = False
_logger.info("=====================================", e)
raise UserError('NC下发执行超时, 请检查下发状态')
def get__state(self):
pay_time = str(datetime.now())
json = {
'params': {
'model_name': 'jikimo.process.order',
'field_name': 'name',
'default_code': 'PO-2022-1207-0020',
'state': '待付款',
# 'pay_time': pay_time,
# 'get_order_sf': 21,
},
}
# res_str = json.dumps(vals)
url = 'https://bfm.cs.jikimo.com/api/get/state'
requests.post(url, json=json, data=None)
class DeliveryRecord(models.Model):
"""
扫码托盘码可查到制造订单,由制造订单查工单
"""
_name = "delivery.record"
_description = 'Delivery Record'
delivery_type = fields.Char(string='下发方式', readonly=True)
delivery_time = fields.Char(string='下发时间', readonly=True)
influence_record = fields.Char(string='影响记录', readonly=True)
workorder_id = fields.Many2one('mrp.workorder', string='工单')
sf_cnc_processing_id = fields.Many2one('sf.cnc.processing', string='NC')
# @api.model
# def create(self, values):
# try:
# values['order_code'] = self.env['ir.sequence'].next_by_code('sf_machine_connect.delivery.record')
# stock = self.env['sunrise.u.stock']
# if 'order_items' in values.keys():
# for item in values['order_items']:
# stock_commodity = stock.search([('commodity', '=', item[2]['commodity'])])
# stock_commodity.amount += item[2]['amount']
# return super().create(values)
# except:
# raise Exception('b_purchase_order.py:create()')

View File

@@ -0,0 +1,134 @@
# -*- coding: utf-8 -*-
import os
import logging
from ftplib import FTP
_logger = logging.getLogger(__name__)
class FTP_P(FTP):
"""
重写FTP类重写dirs方法
"""
def dirs(self, *args):
"""List a directory in long form.
By default list current directory to stdout.
Optional last argument is callback function; all
non-empty arguments before it are concatenated to the
LIST command. (This *should* only be used for a pathname.)"""
cmd = 'LIST'
templist = []
tempdic = {}
func = None
if args[-1:] and type(args[-1]) != type(''):
args, func = args[:-1], args[-1]
for arg in args:
if arg:
cmd = cmd + (' ' + arg)
self.retrlines(cmd, templist.append)
# 处理返回结果,只需要目录名称
r_files = [file.split(" ")[-1] for file in templist]
tempdic['name'] = [file for file in r_files if file != "." and file != ".."]
# 去除. ..
return tempdic
# return [file for file in r_files if file != "." and file != ".."]
# FTP接口类
class FtpController:
"""
这是ftp接口类在类初始化的时候就连接了ftp服务器能否成功连接有反馈。
类中定义了两个接口:上传接口和删除接口
"""
# 三菱机床连接
def __init__(self, host="192.168.2.158", port=8080, username="MITSUBISHI", password="CNC"):
_logger.info("===================ftppppp==================")
self.host = host
self.port = port
self.username = username
self.password = password
# _logger.info("===================ftppppp==================%s,%s,%s,%s" % self.host, self.port, self.username, self.password)
# 测试
print("==============================================")
print(self.username, self.port, self.host, self.password)
ftp = FTP_P()
_logger.info("===================connect==================")
# self.ftp.set_debuglevel(2) #打开调试级别2显示详细信息
ftp.set_pasv(0) # 0主动模式 1 #被动模式
try:
ftp.connect(self.host, self.port)
ftp.login(self.username, self.password)
_logger.info("=================连接成功==================")
print("连接成功")
self.ftp = ftp
except Exception as e:
print("连接失败" + str(e))
# 试验接口
def prin(self):
print("这是试验接口")
# 三菱代码下发
def upload_file(self, remotepath='/(192,168,199,2)/DS/Z4.5.NC', localpath='D:/ftp/up/Z4.5.NC'):
"""
第一个是要上传到ftp服务器路径下的文件第二个是本地要上传的的路径文件
:param remotepath: 上传和下载都需要设置工作目录,注意只能使用文件名,不能有路径中的冒号
:param localpath:
:return:
"""
bufsize = 8192
# fp = open(localpath, 'rb')
# self.ftp.storbinary('STOR ' + remotepath, fp, bufsize)
# fp.close()
with open(localpath, mode='rb') as file:
self.ftp.storbinary('STOR ' + remotepath, file, bufsize)
# 关闭连接
def close_ftp(self):
"""
下发完成后关闭ftp连接减少资源损耗
"""
self.ftp.close()
def delAllfile(self, ftppath):
"""
删除ftp服务器端全部文件
:param ftppath:
:return:
"""
dir_res = []
try:
print(ftppath)
try:
self.ftp.cwd(ftppath)
except Exception as e:
print("进入ftp目录失败" + str(e))
self.ftp.dir('.', dir_res.append) # 对当前目录进行dir(),将结果放入列表
print(dir_res)
# for i in dir_res:
# if i.startswith("d"):
# dirName = i.split(" ")[-1]
# print("开始删除" + dirName + "文件夹")
# delAllfile(ftp, ftp.pwd() + "/" + dirName)
# ftp.cwd('..')
# print(ftppath + "/" + dirName)
# ftp.rmd(ftppath + '/' + dirName)
# else:
# filelist = ftp.getfiles(ftppath)
# for f in filelist:
# print("删除FTP目录" + ftppath + "下存在文件:" + f)
# ftp.delete(f)
except Exception as e:
print("删除失败" + str(e))
# 出现550 not found file是路径不对
def del_file(self, delpath='/(192,168,199,2)/DS/Z4.5.NC'):
"""
删除ftp服务器端指定文件
:param delpath:
:return:
"""
self.ftp.delete(delpath)

View File

@@ -0,0 +1,46 @@
from opcua import ua, Client
class Py2opcua:
"""
将三元检测补偿值写入opcua服务器
"""
def __init__(self, url='opc.tcp://192.168.2.99:4840'):
self.client = Client(url, timeout=3600000)
# 连接客户端
# def connect(self):
# try:
# self.client.connect()
# print("opcua服务器连接成功可以写入")
# return self.client
# except Exception as e:
# print("opcua服务器连接失败请检查" + str(e))
def write(self, temp_dict):
"""
补偿值写入方法,参数是一个字典,键是节点名,值是补偿值
:param temp_dict:
:return:
"""
# try:
self.client.connect()
# print("opcua服务器连接成功可以写入")
# return self.client
# except Exception as e:
# print("opcua服务器连接失败请检查" + str(e))
# temp_dict = temp_dict
temp_list = list(temp_dict.items())
for i in range(len(temp_list)):
# 寻找节点上的变量
var = self.client.get_node(temp_list[i][0])
# var.set_value(ua.Variant(1.234, ua.VariantType.Float))
# 通过set_value写值
var.set_value(ua.Variant(temp_list[i][1], ua.VariantType.Double))
# print("%s 已写入" % var.get_value())
self.client.disconnect()
# 断开连接
# def disconnect(self):
# self.client.disconnect()